我试图在插入语句后得到一个键值。 例子: 我有一个表的属性名称和id。Id是一个生成的值。
INSERT INTO table (name) VALUES('bob');
现在我想在同一步骤中取回id。这是怎么做到的?
我们使用的是Microsoft SQL Server 2008。
我试图在插入语句后得到一个键值。 例子: 我有一个表的属性名称和id。Id是一个生成的值。
INSERT INTO table (name) VALUES('bob');
现在我想在同一步骤中取回id。这是怎么做到的?
我们使用的是Microsoft SQL Server 2008。
当前回答
有很多方法可以在插入后退出
在向表中插入数据时,可以使用OUTPUT子句 返回已插入到表中的数据的副本。的 OUTPUT子句有两种基本形式:OUTPUT和OUTPUT INTO。使用 如果希望将数据返回给调用应用程序,则使用OUTPUT表单。 如果希望将数据返回到表或表中,则使用OUTPUT INTO表单 表变量。
DECLARE @MyTableVar TABLE (id INT,NAME NVARCHAR(50));
INSERT INTO tableName
(
NAME,....
)OUTPUT INSERTED.id,INSERTED.Name INTO @MyTableVar
VALUES
(
'test',...
)
IDENT_CURRENT:它返回在任何会话中为特定表或视图创建的最后一个标识。
SELECT IDENT_CURRENT('tableName') AS [IDENT_CURRENT]
SCOPE_IDENTITY:它返回同一个会话和同一个作用域的最后一个标识。作用域是存储过程/触发器等。
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
@@IDENTITY:返回同一会话的最后一个标识。
SELECT @@IDENTITY AS [@@IDENTITY];
其他回答
INSERT INTO files (title) VALUES ('whatever');
SELECT * FROM files WHERE id = SCOPE_IDENTITY();
这是最安全的选择,因为在带有触发器的表上存在OUTPUT子句冲突的已知问题。这使得它非常不可靠,即使你的表目前没有任何触发器-有人添加一个下线将破坏你的应用程序。像定时炸弹一样的行为。
详见msdn文章:
http://blogs.msdn.com/b/sqlprogrammability/archive/2008/07/11/update-with-output-clause-triggers-and-sqlmoreresults.aspx
建议使用SCOPE_IDENTITY()来获取新的ID值,而不是使用“OUTPUT Inserted”。ID”
如果插入语句抛出异常,我将直接抛出它。而是“输出插入”。ID”将返回0,这可能与预期不同。
你可以使用scope_identity()选择刚刚插入变量的行ID然后从表中选择你想要的任何列其中ID =你从scope_identity()中得到的标识
请在这里查看MSDN信息http://msdn.microsoft.com/en-us/library/ms190315.aspx
有很多方法可以在插入后退出
在向表中插入数据时,可以使用OUTPUT子句 返回已插入到表中的数据的副本。的 OUTPUT子句有两种基本形式:OUTPUT和OUTPUT INTO。使用 如果希望将数据返回给调用应用程序,则使用OUTPUT表单。 如果希望将数据返回到表或表中,则使用OUTPUT INTO表单 表变量。
DECLARE @MyTableVar TABLE (id INT,NAME NVARCHAR(50));
INSERT INTO tableName
(
NAME,....
)OUTPUT INSERTED.id,INSERTED.Name INTO @MyTableVar
VALUES
(
'test',...
)
IDENT_CURRENT:它返回在任何会话中为特定表或视图创建的最后一个标识。
SELECT IDENT_CURRENT('tableName') AS [IDENT_CURRENT]
SCOPE_IDENTITY:它返回同一个会话和同一个作用域的最后一个标识。作用域是存储过程/触发器等。
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
@@IDENTITY:返回同一会话的最后一个标识。
SELECT @@IDENTITY AS [@@IDENTITY];
最好和最可靠的解决方案是使用SCOPE_IDENTITY()。
你只需要在每次插入后获取作用域标识并将其保存在一个变量中,因为你可以在同一个作用域中调用两个插入。
Ident_current和@@identity可能是他们工作,但他们不是安全范围。在大型应用程序中可能会出现问题
declare @duplicataId int
select @duplicataId = (SELECT SCOPE_IDENTITY())
更多细节在这里微软文档