[英]@@IDENTITY, SCOPE_IDENTITY(), OUTPUT and other methods of retrieving last identity
我看到插入后检索主键标识字段的值时使用了各种方法。
declare @t table (
id int identity primary key,
somecol datetime default getdate()
)
insert into @t
default values
select SCOPE_IDENTITY() --returns 1
select @@IDENTITY --returns 1
在插入后返回一个标识表:
Create Table #Testing (
id int identity,
somedate datetime default getdate()
)
insert into #Testing
output inserted.*
default values
哪种方法合适或更合适? OUTPUT方法的作用域安全吗?
这取决于您要做什么...
@@ IDENTITY
返回在连接上生成的最后一个IDENTITY值,而不管生成该值的表如何,以及生成该值的语句的范围如何。 @@ IDENTITY将返回当前会话中输入到表中的最后一个身份值。 @@ IDENTITY限于当前会话,并且不限于当前范围。 例如,如果您在一个表上有一个触发器,导致要在另一个表中创建一个标识,那么即使它是创建它的触发器,您也会获得最后创建的标识。
SCOPE_IDENTITY()
返回由连接和同一作用域中的语句产生的最后一个IDENTITY值,而不管产生该值的表如何。 SCOPE_IDENTITY()与@@ IDENTITY相似,但是它将值限制为当前范围。 换句话说,它将返回您显式创建的最后一个标识值,而不是由触发器或用户定义的函数创建的任何标识。
IDENT_CURRENT()
返回表中产生的最后一个IDENTITY值,而不管产生该值的语句的连接和范围如何。 IDENT_CURRENT限于指定的表,但不受连接或作用域的限制。
请注意, scope_identity()
和@@identity
中存在错误-请参阅MS Connect: https : scope_identity()
引用(来自Microsoft):
我强烈建议在所有情况下都使用
OUTPUT
而不是@@IDENTITY
。 这是读取身份和时间戳的最佳方法。
编辑添加:现在可能已解决。 Connect给我一个错误,但请参阅:
尝试获取刚刚插入的行的标识时,几乎没有理由使用OUTPUT
子句之外的任何东西。 OUTPUT子句是作用域和表安全的。
这是插入单行后获取ID的简单示例...
DECLARE @Inserted AS TABLE (MyTableId INT);
INSERT [MyTable] (MyTableColOne, MyTableColTwo)
OUTPUT Inserted.MyTableId INTO @Inserted
VALUES ('Val1','Val2')
SELECT MyTableId FROM @Inserted
OUTPUT子句的详细文档: http : //technet.microsoft.com/zh-cn/library/ms177564.aspx
-- table structure for example:
CREATE TABLE MyTable (
MyTableId int NOT NULL IDENTITY (1, 1),
MyTableColOne varchar(50) NOT NULL,
MyTableColTwo varchar(50) NOT NULL
)
@@身份是老派的方式。 在以后的所有实例中都使用SCOPE_IDENTITY()。 有关使用@@ IDENTITY的影响,请参见MSDN (它们很糟糕!)。
SCOPE_IDENTITY对于单行就足够了,建议使用SCOPE_IDENTITY,除非由于某些原因(为什么?)需要查看中间TRIGGER的结果。
对于多行,OUTPUT / OUTPUT INTO是您最好的新朋友,也是重新查找行并插入到另一个表的替代方法。
SQL Server 2005中提供了另一种方法,该方法在Wild中的SQL中概述。
这将允许您在插入后检索多个身份。 这是博客文章中的代码:
Create Table #Testing (
id int identity,
somedate datetime default getdate()
)
insert into #Testing
output inserted.*
default values
对Godeke答案的一个小更正:
这不仅是您需要担心的触发器。 导致创建标识符的任何种类的嵌套操作(例如存储的proc)都可以更改@@ IDENTITY的值。
再次投票给scope_identity ...
使用@@ IDENTITY时要格外小心...
http://dotnetgalactics.wordpress.com/2009/10/28/scope-identity-vs-identity/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.