在特定表上的SQL中使用@@ IDENTITY

Mat*_*att 2 sql sql-server sql-server-2008

如何获取特定表的@@ IDENTITY?

我一直在做

select * from myTable 
Run Code Online (Sandbox Code Playgroud)

因为我假设这设置范围,然后从SSMS中的同一窗口SQL查询窗口运行

select @@IDENTITY as identt
Run Code Online (Sandbox Code Playgroud)

它将identt作为null返回,这是不可能的,因为myTable已经有很多entrie了.

我希望它返回下一个可用的ID整数.

myTable的ID列设置为主键和自动增量.

Ran*_*ica 9

您可以使用IDENT_CURRENT

IDENT_CURRENT( 'table_name' )
Run Code Online (Sandbox Code Playgroud)

请注意,IDENT_CURRENT 在任何会话和任何范围内返回表的最后一个标识值.这意味着,如果在您的标识值之后插入了另一个标识值,那么您将不会检索您插入的标识值.


mar*_*c_s 6

您只能SELECT @@IDENTITY在插入后真正使用- 最后一次插入具有IDENTITY列的表是您将获得的值.

你不能将它"限制"到一个表 - @@ IDENTITY中的值 - 顺便说一句,我强烈建议使用SCOPE_IDENTITY()代替! - 是已设置的任何IDENTITY列的最后一个值.

@@ IDENTITY的问题在于它将报告插入到任何表中的最后一个IDENTITY值 - 如果您的数据表中的INSERT将导致例如触发器将条目写入Audit表,并且Audit表具有IDENTITY字段,你将获得IDENTITY值 - 而不是插入表中的值.SCOPE_IDENTITY()解决了这个问题.