2010-09-13 14 views
6

Birisi T-Sql kullanırken @@Identity'u nasıl iade edebilirim biliyor mu? BöyleT-Sql @@ Kimlik

şey: Bunun gibi

set @Sql = "insert into table....values()..." 
exec @sql 
return @@Identity 
+1

öyle mi ne ortalama getiri @@ Kimlik? Nereden? Ve aslında @@ Kimlik veya scope_identity'ye ihtiyacınız var mı? –

+0

Tam @@ kimliğine ihtiyacım var. –

+0

@user - Eğer orijinal tablodaki bir tetikleyici, bir kimlik sütunu ile başka bir tabloya eklerse, o ikinci tablo için kimliğe ihtiyacınız var mı? –

cevap

3
INSERT INTO TableName (Field1, Field2, Field3) VALUES (1, 2, 3); 
SELECT SCOPE_IDENTITY(); 

Bu, çok bildirimli bir toplu iş olduğundan, her istemci kitaplığının değerlerini aynı şekilde döndüreceğinden emin değilim; Örneğin klasik ADO'da, değeri okuyabilmeniz için bir sonraki kayıt kümesine ilerlemeniz gerekebilir. Ancak, ADO.NET kullanıyorsanız, yukarıdaki tüm dizgede ExecuteScalar'u kullanabileceğinizi ve SCOPE_IDENTITY değerinizi iyi paraya dönüştürebileceğinizi biliyorum.

Dikkat: ADO.NET değeri beklediğiniz gibi int değil, decimal olarak döndürecektir. Bunun nedeni, SCOPE_IDENTITY nedenlerinden dolayı numeric(38,0) olarak yazılmıştır. Bu nedenle ya int'a atmadan önce decimal'a ExecuteScalar sonucunu vermeniz ya da SELECT CAST(SCOPE_IDENTITY() AS INT) (IDENTITY alanınızın bir INT olduğu varsayılarak, daha büyük sayısal bir tür değil) gerekir.

+0

Greate. Teşekkürler. –

+3

Ben ** her zaman SCIPE_IDENTITY yerine @ IDENTITY kullanıyorum –

+0

'SCOPE_IDENTITY' hakkında bile bilmiyordum, ama haklısınız gibi görünüyor. Bir kaç dakikalık gözden geçirme işleminden, '@ IDENTITY' hatalarını yapmak için bazı egzotik durumları (diğer tablolara daha fazla INSERT yapan INSERT tetikleyicileri gibi) alır; ama yine de haklısınız, 'SCOPE_IDENTITY' Doğru Şey. Cevabımı güncelledim. –

5

:

INSERT INTO Table(...) 
OUTPUT INSERTED.IdColumn 
VALUES(...) 
+0

bu t-sql'de çalışacak mı? exec kullanırken sql? –

+0

Bu, 2008 ve sonrasında çalışacaktır. Ve bunun güzelliği, eğer ihtiyaç duyduğunuzda başka alanları da tekrarlayabilirsiniz. – HLGEM

4

Ekleme "; @@ kimliğini seçin" ekinizin açıklamaya:

insert into tab (x,y,z) values (a,b,c); select @@identity 

döndü değerdir ID (kullanma ExecuteScalar)

+1

Lütfen satırları bir kimlik sütunuyla başka bir tabloya ekleyen bir ek tetikleyiciniz varsa @@ kimliğinin yanlış sonuç vereceğini unutmayın. Ken'in önerdiği gibi SCOPE_IDENTITY kullanmak daha güvenli ve geleceğe daha dayanıklı. Bkz. Http://msdn.microsoft.com/tr-tr/kütüphane/ms190315.aspx. – EventHorizon

7

Bu, örtük gereksinimlerinizden birinin dinamik SQL'in çalıştırılmasıdır. Bunun karşı tavsiye ediyorum da, bunun senle aradığınızı başarabilirsiniz:

set @Sql = 'insert into table....values()...; select SCOPE_IDENTITY()' 
exec(@Sql) 
1

Sen Id Kimlik alandır bu

Insert into Table(Col2, Col3) 
output inserted.Id 
values ('xyz', 'abc') 

kullanabilirsiniz