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

时间:2010-01-05 22:02:32

标签: sql sql-server sql-server-2008

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

我一直在做

select * from myTable 

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

select @@IDENTITY as identt

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

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

myTable的ID列设置为主键并自动增量。

5 个答案:

答案 0 :(得分:9)

您可以使用IDENT_CURRENT

IDENT_CURRENT( 'table_name' )

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

答案 1 :(得分:6)

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

你不能将它“限制”到一个表格 - @@ IDENTITY中的值 - 顺便说一下,我强烈建议使用SCOPE_IDENTITY()来强烈推荐! - 是已设置的任何IDENTITY列的最后一个值。

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

答案 2 :(得分:2)

IDENT_CURRENT做你想要的。但不要。

这是对marc_s'回答

的补充

答案 3 :(得分:1)

我从来不知道以这种方式使用@@ IDENTITY,我只是用它来访问新插入记录的ID。

答案 4 :(得分:0)

这是对的。 @@ IDENTITY不能以您认为的方式使用。它只能在INSERT进入表后使用。让我们考虑一下这个场景:

您有两个表:Order(主键:OrderID),OrderDetails(外键:OrderID)

你表演 插入订单 VALUES( '枕头') - 请注意,Value中未提及OrderId,因为它是自动编号(主键)

现在您想要在OrderDetail中执行插入操作。但是,在插入“Pillows”记录之前,您并不总是记得Order表中有多少条记录,因此您不记得插入Order表的最后一条PrimaryKey是什么。您可以,但即便如此,当您插入OrderDetail表时,您也不希望特别提及插入(假设OrderID为1)。

因此,你的OderDetail插件有点像: INSERT INTO OrderDetail VALUES(@@ IDENTITY,'Soft Pillows')

希望这能解释@@ IDENTITY的用户。