我见过在插入后检索主键标识字段的值时使用的各种方法。
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/