当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《@@IDENTITY,SCOPE_IDENTITY(),OUTPUT和其他检索最后一个身份的方法》经验,为你挑选了4个好方法。

我已经看到在插入后检索主键标识字段的值时使用的各种方法.

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借来的



1> mson..:

这取决于你想要做什么......

@@ IDENTITY

返回在连接上生成的最后一个IDENTITY值,无论生成该值的表如何,也不管生成该值的语句的范围如何.@@ IDENTITY将返回在当前会话中输入到表中的最后一个标识值.@@ IDENTITY仅限于当前会话,不限于当前范围.例如,如果您在表上触发了导致在另一个表中创建标识的触发器,您将获得最后创建的标识,即使它是创建它的触发器.

SCOPE_IDENTITY()

返回在连接上生成的最后一个IDENTITY值以及同一范围内的语句,而不管生成该值的表.SCOPE_IDENTITY()类似于@@ IDENTITY,但它也会将值限制为当前范围.换句话说,它将返回您显式创建的最后一个标识值,而不是由触发器或用户定义的函数创建的任何标识.

IDENT_CURRENT()

返回表中生成的最后一个IDENTITY值,而不管生成该值的语句的连接和范围如何.IDENT_CURRENT仅限于指定的表,但不受连接或范围的限制.


您没有描述使用OUTPUT,这是新版SQL Server中的首选方法.它不仅范围安全,而且如果您需要它们进行未来处理,它可以返回多个身份甚至其他字段.
@HLGEM据说@@ identity将被OUTPUT取代?
@HLGEM,OUTPUT很好,但是当你只需要一个身份值时,使用起来有点尴尬.

2> Simon D..:

请注意,scope_identity()和@@ identity中存在错误 - 请参阅connect:https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID = 328811

引用(来自Microsoft):

"在所有情况下,我都非常推荐使用OUTPUT而不是@@ IDENTITY.这是阅读身份和时间戳的最佳方式."

编辑添加:现在可以修复,Connect给我一个错误,但是看到:

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



3> JeremyWeir..:

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/en-us/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
)


注意:在游标中使用此类事物时,请确保在每次迭代中从表变量中删除所有内容,因为DECLARE不会重新初始化.

4> jcollum..:

@@身份是旧学校的方式.在所有实例中使用SCOPE_IDENTITY().有关使用@@ IDENTITY的影响,请参阅MSDN(它们很糟糕!).


@Dems,这是不公平的
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有