获取最后插入的行ID(带有SQL语句)
当在表格中插入新logging时,我想获取新创build的ID。
我读了这个: http : //msdn.microsoft.com/en-us/library/ms177564.aspx但它需要创build临时表。
我想在执行INSERT语句之后返回ID(假设只执行一个INSERT)。
例:
1 Joe Joe 2 Michael Mike 3 Zoe Zoe
当执行INSERT语句时,我想返回创build的ID,意思是4。
可以告诉我怎么做,使用SQL语句或不可能?
如果您的SQL Server表具有INT IDENTITY
(或BIGINT IDENTITY
)types的列,则可以使用以下命令获取最新的插入值:
INSERT INTO dbo.YourTable(columns....) VALUES(..........) SELECT SCOPE_IDENTITY()
只要你没有插入另一行,它就会工作 – 它只是返回在这个范围内发送的最后一个IDENTITY
值。
至less有两个选项 – @@IDENTITY
和IDENT_CURRENT
– 在这篇由Pinal Dave在这篇出色的博客文章中,详细了解他们是如何工作的以及他们以何种方式不同(可能会给你意想不到的结果)。
假设一个简单的表格:
CREATE TABLE dbo.foo(ID INT IDENTITY(1,1), name SYSNAME);
我们可以在表variables中捕获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;
这个方法的SCOPE_IDENTITY()
是(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
值,而不pipe创build值的连接是什么,也不pipe产生该值的语句的范围如何。
IDENT_CURRENT
不受范围和会话的限制; 它仅限于指定的表格。 IDENT_CURRENT
返回为任何会话和任何作用域中的特定表生成的标识值。