有人知道如何在使用T-Sql时返回@@Identity
?T-Sql @@ Identity
事情是这样的:
set @Sql = "insert into table....values()..."
exec @sql
return @@Identity
有人知道如何在使用T-Sql时返回@@Identity
?T-Sql @@ Identity
事情是这样的:
set @Sql = "insert into table....values()..."
exec @sql
return @@Identity
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,而不是某个较大的数字类型)。
Greate。谢谢。 – 2010-09-13 12:25:18
我会**总是**使用SCOPE_IDENTITY而不是@@ IDENTITY – 2010-09-13 13:23:01
我甚至不知道'SCOPE_IDENTITY',但看起来你是对的。从几分钟的略读,看起来会需要一些异国情况(比如INSERT触发器在其他表中执行更多INSERT操作)来使“@@ IDENTITY”错误;但是,你说得对,'SCOPE_IDENTITY'是正确的。我已经更新了我的答案。 – 2010-09-14 03:18:30
像这样:
INSERT INTO Table(...)
OUTPUT INSERTED.IdColumn
VALUES(...)
这将工作在t-sql?什么时候使用exec @sql? – 2010-09-13 12:10:45
这将在2008年及以上。它的美妙之处在于,如果你需要它们,你也可以重新建立其他领域。 – HLGEM 2010-09-13 19:28:02
追加 “;选择@@身份” 到您的插入语句:
insert into tab (x,y,z) values (a,b,c); select @@identity
返回的值是ID(使用ExecuteScalar)
请注意,如果您有插入触发器将行插入带有标识列的另一个表中,则使用@@标识将产生不正确的结果。 Ken建议使用SCOPE_IDENTITY更安全,更具前瞻性。请参阅http://msdn.microsoft。COM/EN-US /库/ ms190315.aspx。 – EventHorizon 2011-08-10 12:05:05
它看起来像一个隐含的要求是执行动态SQL。虽然我反对这个建议,你可以完成你正在寻找与此:
set @Sql = 'insert into table....values()...; select SCOPE_IDENTITY()'
exec(@Sql)
您可以使用此
Insert into Table(Col2, Col3)
output inserted.Id
values ('xyz', 'abc')
哪里Id
是你的标识字段
你这是什么意味着返回@@身份?来自哪里?你真的需要@@ Identity或scope_identity吗? – 2010-09-13 12:08:31
我需要确切的@@身份。 – 2010-09-13 12:09:30
@user - 因此,如果原始表上的触发器插入具有标识列的另一个表中,则需要该第二个表的标识? – 2010-09-13 12:11:04