我想在表格中插入新记录时获取新创建的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语句或不可能吗?
答案 0 :(得分:172)
如果您的SQL Server表有一个类型为INT IDENTITY
(或BIGINT IDENTITY
)的列,那么您可以使用以下命令获取最新插入的值:
INSERT INTO dbo.YourTable(columns....)
VALUES(..........)
SELECT SCOPE_IDENTITY()
只要您还没有插入另一行,它就会有效 - 它只返回此范围内分发的最后IDENTITY
值。
至少还有两个选项 - @@IDENTITY
和IDENT_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
返回在任何会话和任何范围内为特定表生成的标识值。