我试图在插入语句后得到一个键值。 例子: 我有一个表的属性名称和id。Id是一个生成的值。

    INSERT INTO table (name) VALUES('bob');

现在我想在同一步骤中取回id。这是怎么做到的?

我们使用的是Microsoft SQL Server 2008。


当前回答

@@IDENTITY是一个系统函数,返回最后插入的标识值。

其他回答

使用SCOPE_IDENTITY()获取新的ID值

INSERT INTO table (name) VALUES('bob');

SELECT SCOPE_IDENTITY()

http://msdn.microsoft.com/en-us/library/ms190315.aspx

*参数在连接字符串中的顺序有时很重要。* Provider参数的位置可以在添加一行后中断记录集游标。我们在SQLOLEDB提供程序中看到了这种行为。

添加行之后,行字段不可用,除非Provider被指定为连接字符串中的第一个参数。当提供程序位于连接字符串中的任何位置(除了第一个参数之外)时,新插入的行字段将不可用。当我们将提供者移动到第一个参数时,行字段神奇地出现了。

你可以使用scope_identity()选择刚刚插入变量的行ID然后从表中选择你想要的任何列其中ID =你从scope_identity()中得到的标识

请在这里查看MSDN信息http://msdn.microsoft.com/en-us/library/ms190315.aspx

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

不需要单独的SELECT…

INSERT INTO table (name)
OUTPUT Inserted.ID
VALUES('bob');

这也适用于非identity列(比如guid)