sql - @@IDENTITY、SCOPE_IDENTITY()、OUTPUT 和其他检索最后身份的方法

标签 sql sql-server tsql identity output-clause

我见过在插入后检索主键标识字段的值时使用的各种方法。

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 方法范围安全吗?

第二个代码片段借自 SQL in the Wild

最佳答案

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

@@身份

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

SCOPE_IDENTITY()

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

IDENT_CURRENT()

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

关于sql - @@IDENTITY、SCOPE_IDENTITY()、OUTPUT 和其他检索最后身份的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/481395/

相关文章:

tsql - 请帮助将 Tsql "implicit joins"转换为显式的

sql:删除 + 插入 vs 更新 + 插入

php - 如果连接两个表,则从第二个表获取 ID

mysql查询从前3个字母为alpha(字符)的列中获取所有记录

sql - 表值参数默认值或通过内联

sql - 使用表别名 UPSERT 来自另一个数据库的表

mysql - 仅获取表 "products"中的结果(如果它们在其他两个表中具有条目(由 ID 和产品类型列标识))

sql - 获取每列的最新值

sql-server - 组内 STRING_AGG 和 Visual Studio 的问题

sql - 如何在 SQL Server 2005 中的一条语句中更新两个表?