2009-06-10 9 views
11

Otomatik bir anahtar alanı ile bir SQLServer tablosuna yerleştiriyorum. (Bu SQLSunucusu bir IDENTITY sütunu denir inanıyoruz.)Yeni bir IDENTITY sütun değerini bir SQLServer SELECT ifadesinden nasıl döndürebilirim?

Oracle olarak, benim INSERT deyimi oluşturulan değeri dönecektir bir SELECT sorgusu gibi ayarlanmış bir sonuç vermek için İADESİ anahtar kelime kullanabilirsiniz:

INSERT INTO table 
(foreign_key1, value) 
VALUES 
(9, 'text') 
RETURNING key_field INTO :var; 

Bunu SQL Server'da nasıl yapabilirim?

Bonus: Tamam, şu ana kadar güzel cevaplar, ancak mümkünse nasıl tek bir ifade içine koyabilirim? :)

+0

"Bir çağrı" örneği eklendi. – gbn

cevap

17

Genel olarak, tek bir bildirimde yapılamaz.

Ancak SELECT SCOPE_IDENTITY(), INSERT deyiminden sonra doğrudan yerleştirilebilir ve bu nedenle hepsi aynı veritabanı çağrısında yapılır.

Örnek:

mydb.ExecuteSql("INSERT INTO table(foreign_key1, value) VALUES(9, 'text'); SELECT SCOPE_IDENTITY();"); 

Sen OUTPUT kullanabilirsiniz, ancak bilmeniz gereken bazı sınırlamaları vardır: 9 (INTO tablo (foreign_key1, değer) VALUES

http://msdn.microsoft.com/en-us/library/ms177564.aspx

+4

Inanılmaz. Bunun gibi ifadeleri birleştirebileceğime dair hiçbir fikrim yoktu. Zeki, standart olmayan, iğrenç, yararlı ... tüm bu sıfatlar akla geliyor. :) – skiphoppy

+1

SQL Server 2005'te OUTPUT ile tek bir ifadede yapılabilir – gbn

9
SELECT SCOPE_IDENTITY() 

Düzenleme: bir oyun olması ...

sadece OUTPUT fıkra yerel değişkenler destekliyorsa. Neyse

, yerine bir tekil

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50)) 

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol 
SELECT 'harry' 
UNION ALL 
SELECT 'dick' 
UNION ALL 
SELECT 'tom' 

Düzenleme 2'den kimlikleri aralığı almak için: Bir görüşmesinde. Bu yapıyı kullanmak için hiçbir zaman fırsatım olmadı. Ayrıca

DECLARE @Mytable TABLE (keycol int IDENTITY (1, 1), valuecol varchar(50)) 

INSERT @Mytable (valuecol) 
OUTPUT Inserted.keycol 
VALUES('foobar') 
+0

Bu ikinciye. SCOPE_IDENTITY(), en son sorgunuzun kapsamı içindeki en yeni kimliği döndürür. Diğer yöntemler @@ IDENTITY ve IDENT_CURRENT(), bu yanıt için –

+0

hhmm bir anonim downvote belirli bir kapsam ile sınırlı değildir ... – gbn

2

SCOPE_IDENTITY

4

ayrıca SCOPE_IDENTITY() ve IDENT_CURRENT içine bakmak gerekir, KİMLİĞİNİ @@ için(). Büyük olasılıkla SCOPE_IDENTITY() istersiniz. @@ IDENTITY, izlemeye çalıştığınız gerçek tablodaki bir tetikleyicide oluşturulan bir kimlik değerini döndürmesi açısından bir soruna sahiptir.

Ayrıca, bunlar tek değerli işlevlerdir. Oracle RETURNING anahtar kelimesinin nasıl çalıştığını bilmiyorum.

0

Eklenen birden çok kimlik yakalayabilmenin ek avantajlarına sahip OUTPUT INTO kullanabilirsiniz.

0

INSERT, 'text'), SELECT @@ IDENTITY;

2

Arama içeriğinize bağlıdır.

Bunu istemci kodundan alıyorsanız, OUTPUT özelliğini kullanabilir ve ardından döndürülen değeri okuyabilirsiniz.

DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20)) 

INSERT INTO @t (ColStr) 
OUTPUT Inserted.ColID 
VALUES ('Hello World') 

Sonuç:

 ColID 
----------- 
      1 

bir saklı yordam bu sarma ediyorsanız, OUTPUT kullanarak daha fazla iştir. Orada SCOPE_IDENTITY() öğesini kullanmak isteyeceksiniz, ancak bunu tek bir bildirimde yapamazsınız. Elbette, birden fazla ifadeyi tek bir satıra ';' Ayırıcı, ama bu tek bir açıklama değil.

DECLARE @idValue int 
DECLARE @t TABLE (ColID int IDENTITY, ColStr varchar(20)) 

INSERT INTO @t (ColStr) VALUES ('Hello World') 

SELECT @idValue = SCOPE_IDENTITY() 

Sonuç: @idValue değişkeni, kimlik değerini içerir. Değeri döndürmek için bir OUTPUT parametresi kullanın.

İlgili konular