Kimlik değerini almak için INSERT deyiminin OUTPUT yan tümcesini nasıl kullanabilirim?


240

Eğer gibi bir ekleme deyimi varsa:

INSERT INTO MyTable
(  
  Name,
  Address,
  PhoneNo
)
VALUES
(
  'Yatrix',
   '1234 Address Stuff',
   '1112223333'
)

ÇIKTI yan tümcesini kullanarak @var INTyeni satırın kimlik değerine (çağrılan Id) nasıl ayarlayabilirim ? Örneğin, INSERTED.Name tablo değişkenlerine koyarak örnekleri gördüm, ancak tablo olmayan bir değişkene alınamıyor.

Denedim OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Idama ikisi de işe yaramadı.


3
Zaten @@ SCOPE_IDENTITY hakkında biliyorum, özellikle OUPUT ile nasıl yapılacağını bilmek istiyorum. Teşekkürler.
Yatrix

6
Bir tablo değişkenine eklemeniz ve daha sonra bunu seçmeniz gerekir. Doğrudan OUTPUTyan tümceden bir skaler değişkene atanacak bir sözdizimi yoktur .
Martin Smith

3
ÇIKTI maddesi .. bir tablo veya tablo değişkeni çıkışına sahiptir
mellamokb

5
OUTPUTTümcesi bir tabloya yazar. Bir tablo değişkeni, geçici tablo, ... olabilir.
HABO

2
Sorum özellikle OUTPUT yan tümcesini soruyor .
Yatrix

Yanıtlar:


464

Yeni eklenen kimliğin SSMS konsoluna şu şekilde gönderilmesini sağlayabilirsiniz:

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

Sadece ile SQL sorgusu çalıştırmak - Eğer çağıran app kimlik geri almak gerektiğinde, örneğin C # dan da bunu kullanabilirsiniz .ExecuteScalar()(yerine .ExecuteNonQuery()çıkan okumak için) IDgeri.

Veya yeni eklenen IDT-SQL'in (örneğin daha sonraki işlemler için) yakalanması gerekiyorsa, bir tablo değişkeni oluşturmanız gerekir:

DECLARE @OutputTbl TABLE (ID INT)

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID INTO @OutputTbl(ID)
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

Bu şekilde, birden çok değer koyabilir @OutputTblve bunlara daha fazla işlem yapabilirsiniz. #tempBurada "çıktı hedefi" olarak "normal" geçici bir tablo ( ) veya "gerçek" kalıcı bir tablo da kullanabilirsiniz.


2
Buradaki kodun cevabı kısa ve özdü. ExecuteScalar () FTW
Joe Johnston

10
Sonucu a'ya ekleyebilirsiniz real persistent table- bu son derece harika, çünkü aynı anda tablolarda INSERTbilgi alabileceğiniz anlamına gelir TWO.
gotqn

7
@@ IDENTITY öğesini asla yukarıdan çekmek için kullanmayın. Tetikleyicilerle çalışmanın zor yolunu araştırın ve bir tabloya yapılan değişikliklerin geçmişini kaydettiklerinden ve aynı zamanda yeni bir tabloya eklediklerinden @@ IDENTITY, geçmiş tablosundan değerleri geri döndürmeye başladı. komiklik oradan doğar! Lütfen marc_s çözümünü kullanın. Şimdilik @OutputTbl yöntemiyle gittim, ancak diğer seçeneklerden de etkileniyorum.
Eric Bishard

4
OUTPUT INTO, benim için potansiyel kullanım örneklerinin yaklaşık% 99'u olan "OUTPUT INTO yan tümcesinin hedef tablosu (birincil anahtar, yabancı anahtar) ilişkisinin her iki tarafında olamaz" dışında son derece harika. Bunun nedeni, işlem geri alındığında bile ÇIKIŞ yan tümcesinin verileri döndürebildiğini, ancak tek bir çekimde ilgili tablolar A ve B'ye veri eklemek çok zor olduğunu biraz varsayıyorum.
Robert Calhoun

3
@EricBishard SCOPE_IDENTITY()bunun için daha iyi çalışır.
Derreck Dean
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.