2010-09-13 87 views
6

有人知道如何在使用T-Sql时返回@@IdentityT-Sql @@ Identity

事情是这样的:

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

你这是什么意味着返回@@身份?来自哪里?你真的需要@@ Identity或scope_identity吗? – 2010-09-13 12:08:31

+0

我需要确切的@@身份。 – 2010-09-13 12:09:30

+0

@user - 因此,如果原始表上的触发器插入具有标识列的另一个表中,则需要该第二个表的标识? – 2010-09-13 12:11:04

回答

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

这是一个多语句批处理,所以我不确定每个客户端库都会以相同的方式返回值;在传统的ADO中,例如,可能需要先读取下一个记录集,然后才能读取该值。但是如果你使用ADO.NET,我知道你可以在上面的整个字符串上使用ExecuteScalar,它会返回你的SCOPE_IDENTITY值。

注意:ADO.NET将返回值为decimal,而不是像您期望的那样返回int。这是因为SCOPE_IDENTITY,无论出于何种原因,输入为numeric(38,0)。因此,您需要将ExecuteScalar结果转换为decimal,然后将其转换为int,或者您需要SELECT CAST(SCOPE_IDENTITY() AS INT)(假设您的IDENTITY字段是INT,而不是某个较大的数字类型)。

+0

Greate。谢谢。 – 2010-09-13 12:25:18

+3

我会**总是**使用SCOPE_IDENTITY而不是@@ IDENTITY – 2010-09-13 13:23:01

+0

我甚至不知道'SCOPE_IDENTITY',但看起来你是对的。从几分钟的略读,看起来会需要一些异国情况(比如INSERT触发器在其他表中执行更多INSERT操作)来使“@@ IDENTITY”错误;但是,你说得对,'SCOPE_IDENTITY'是正确的。我已经更新了我的答案。 – 2010-09-14 03:18:30

5

像这样:

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

这将工作在t-sql?什么时候使用exec @sql? – 2010-09-13 12:10:45

+0

这将在2008年及以上。它的美妙之处在于,如果你需要它们,你也可以重新建立其他领域。 – HLGEM 2010-09-13 19:28:02

4

追加 “;选择@@身份” 到您的插入语句:

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

返回的值是ID(使用ExecuteScalar)

+1

请注意,如果您有插入触发器将行插入带有标识列的另一个表中,则使用@@标识将产生不正确的结果。 Ken建议使用SCOPE_IDENTITY更安全,更具前瞻性。请参阅http://msdn.microsoft。COM/EN-US /库/ ms190315.aspx。 – EventHorizon 2011-08-10 12:05:05

7

它看起来像一个隐含的要求是执行动态SQL。虽然我反对这个建议,你可以完成你正在寻找与此:

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

您可以使用此

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

哪里Id是你的标识字段