获取最后插入的行ID(带有SQL语句)

时间:2012-02-28 06:37:25

标签: sql sql-server

我想在表格中插入新记录时获取新创建的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语句或不可能吗?

3 个答案:

答案 0 :(得分:172)

如果您的SQL Server表有一个类型为INT IDENTITY(或BIGINT IDENTITY)的列,那么您可以使用以下命令获取最新插入的值:

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

SELECT SCOPE_IDENTITY()

只要您还没有插入另一行,它就会有效 - 它只返回此范围内分发的最后IDENTITY值。

至少还有两个选项 - @@IDENTITYIDENT_CURRENT - 详细了解它们的工作原理以及它们在哪些方面的不同(并且可能会给您带来意想不到的结果){ {3}}

答案 1 :(得分:49)

假设一个简单的表:

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)它避免this parallelism bug,其中 可能导致错误的结果 ,但到目前为止只在SQL Server 2008 R2 SP1 CU5中修复。

答案 2 :(得分:34)

您可以使用:

SELECT IDENT_CURRENT(‘tablename’)

访问特定表的最新标识。

e.g。考虑以下代码:

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返回在任何会话和任何范围内为特定表生成的标识值。