我想在插入新记录时获取新创建的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语句实现这一点,或者是否不可能?
我想在插入新记录时获取新创建的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语句实现这一点,或者是否不可能?
如果你的SQL Server表有一个INT IDENTITY
(或BIGINT IDENTITY
)类型的列,那么你可以使用以下方式获取最新插入的值:
INSERT INTO dbo.YourTable(columns....)
VALUES(..........)
SELECT SCOPE_IDENTITY()
只要你没有插入另一行数据,这个方法就能正常工作 - 它只会返回在此范围内分配的最后一个IDENTITY
值。
至少还有两种选择 - @@IDENTITY
和IDENT_CURRENT
- 阅读更多关于它们如何工作以及它们之间的差异(可能会给您带来意外结果)的信息,请参考Pinal Dave在这篇优秀博客文章。
SCOPE_IDENTITY()
也可能产生不正确的结果(在并行情况下),请参阅http://support.microsoft.com/kb/2019779 - 修复程序在上周首次提供给2008 R2 SP1 CU5。在所有早期版本中,解决方法是将maxdop设置为1、保持一个固定的计划,该计划不使用并行处理(我没有测试过),或使用输出子句。 - Aaron Bertrandscope_identity
“将返回您明确创建的最后一个标识值,而不是由触发器或用户定义函数创建的任何标识”是错误的 - 我使用触发器向表中插入数据,导致插入到审核表中并且scope_identity
返回null
。实际上,唯一不返回null
的选项是@@identity
- 但它给我返回了审核表的最新ID!因此,这些方法都没有返回我原始插入的最新插入ID。SQL Server 2016。 - youcantryreachingmeClient
没有任何IDENTITY
列 - 所以 INSERT INTO Client()...
显然 不会 触发任何身份标识生成,因此SCOPE_IDENTITY()
将是NULL:.... - marc_sint
和组合PK)。对于其他被困扰的人,这里有一个好的解释:https://dev59.com/C2855IYBdhLWcg3whExL。 - youcantryreachingme假设有一张简单的表:
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)它避免了并行性bug,该bug可能导致错误结果,但目前仅在SQL Server 2008 R2 SP1 CU5中修复。
SELECT @ID = SCOPE_IDENTITY();
- Aaron BertrandSELECT IDENT_CURRENT('tablename')
访问特定表的最新标识符。
例如,考虑以下代码:
INSERT INTO dbo.MyTable(columns....) VALUES(..........)
INSERT INTO dbo.YourTable(columns....) VALUES(..........)
SELECT IDENT_CURRENT('MyTable')
SELECT IDENT_CURRENT('YourTable')
这将产生相应表的正确值。IDENT_CURRENT
无法可靠地确定我插入的最后一行,但它是一个很好的方法,也许可以获取我或其他任何人插入的最后一行。请参阅最后一次:不,你不能信任IDENT_CURRENT()。 - Aaron Bertrand