获取最后插入的行 ID (使用 SQL 语句)

在表中插入新记录时,我希望获得新创建的 ID。

我看到这个: http://msdn.microsoft.com/en-us/library/ms177564.aspx但是它需要创建临时表。

我想在执行 INSERT 语句后返回 ID (假设只执行一个 INSERT)。

例如:

1     Joe      Joe
2     Michael  Mike
3     Zoe      Zoe

在执行 INSERT 语句时,我想返回创建的 ID,即4。

可以告诉我如何做到这一点使用 SQL 语句或它是不可能的吗?

516864 次浏览

如果 SQLServer 表的列类型为 INT IDENTITY(或 BIGINT IDENTITY) ,则可以使用以下方法获取最新插入的值:

INSERT INTO dbo.YourTable(columns....)
VALUES(..........)


SELECT SCOPE_IDENTITY()

只要您没有插入另一行,这就可以工作——它只返回在这个作用域中传递的最后一个 IDENTITY值。

至少还有两个选项—— @@IDENTITYIDENT_CURRENT——阅读更多关于它们如何工作以及它们在这个 Pinal Dave 的精彩博文中的不同之处(可能会给你带来意想不到的结果)。

假设一张简单的表格:

CREATE TABLE dbo.foo(ID INT IDENTITY(1,1), name SYSNAME);

我们可以在表变量中捕获 IDENTITY值以供进一步使用。

DECLARE @IDs TABLE(ID INT);


-- minor change to INSERT statement; add an OUTPUT clause:
INSERT dbo.foo(name)
OUTPUT inserted.ID INTO @IDs(ID)
SELECT N'Fred'
UNION ALL
SELECT N'Bob';


SELECT ID FROM @IDs;

这个方法的优点是(a)它处理多行插入(SCOPE_IDENTITY()只返回最后一个值)和(b)它避免了 这个并行错误(会导致错误的结果) ,但是到目前为止只在 SQL Server 2008 R2 SP1 CU5中修复了。

你可使用:

SELECT IDENT_CURRENT('tablename')

访问特定表的最新标识。

例如考虑下列守则:

INSERT INTO dbo.MyTable(columns....) VALUES(..........)


INSERT INTO dbo.YourTable(columns....) VALUES(..........)


SELECT IDENT_CURRENT('MyTable')


SELECT IDENT_CURRENT('YourTable')

这将产生相应表的正确值。

它返回表中生成的最后一个 IDENTITY值,而不管创建该值的连接是什么,也不管生成该值的语句的作用域是什么。

IDENT_CURRENT不受范围和会话的限制; 它只限于指定的表。IDENT_CURRENT返回在任何会话和任何作用域中为特定表生成的标识值。