繁体   English   中英

@@ IDENTITY,SCOPE_IDENTITY(),OUTPUT和其他检索最后一个身份的方法

[英]@@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方法的作用域安全吗?

第二个代码段是从Wild中的SQL借来

这取决于您要做什么...

@@ 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给我一个错误,但请参阅:

Scope_Identity()返回不正确的值是否已修复?

尝试获取刚刚插入的行的标识时,几乎没有理由使用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 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM