如何获取插入处最后一行的自动增量值

时间:2012-11-19 09:39:21

标签: sql sql-server tsql get

我已经用一周的时间搜索了这个问题而没有任何有用的东西,我认为我没有使用正确的单词

我正在使用带有t-sql的SQL Server 2008,我需要在插入新行时优化我的功能。

我有一个第一列的表是整数自动增量类型的关键,其他列只是用于信息

当我们进行插入时,SQL Server会自动递增密钥,我必须执行select max来获取值,所以有没有像@@IDENTITY之类的全局变量或者避免开始的函数结束交易并选择最大值

5 个答案:

答案 0 :(得分:34)

使用SCOPE_IDENTITY

-- do insert

SELECT SCOPE_IDENTITY();

哪个会给你:

  

插入到标识列中的最后一个标识值   相同的范围。范围是一个模块:存储过程,触发器,   功能或批处理。因此,如果两个语句属于同一范围   它们处于相同的存储过程,功能或批处理中。

答案 1 :(得分:5)

刚刚运行代码:

INSERT INTO Persons (FirstName) VALUES ('Joe');
SELECT ID AS LastID FROM Persons WHERE ID = @@Identity;

它也有效!

答案 2 :(得分:3)

上次自动增量值

的情况如何?
SELECT IDENT_CURRENT('tableName')-IDENT_INCR('tableName');

答案 3 :(得分:0)

如果您使用的是MySQL,则会获得最后一次插入的自动增量ID:

SELECT LAST_INSERT_ID();

请参阅here以获取完整参考。

答案 4 :(得分:0)

在我的情况下,我不得不使用@@ Identity,因为我正在插入视图。似乎SCOPE_IDENTITY仅适用于您明确创建的那些。

见这里:

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

  

@@ IDENTITY将返回输入表中的最后一个标识值   你当前的会议。虽然@@ IDENTITY仅限于当前   会话,它不限于当前范围。如果你有一个触发器   在一个导致在另一个表中创建标识的表上,您   将获得最后创建的标识,即使它是   创建它的触发器。