SQL Server – 在INSERT后返回值

我试图得到一个INSERT语句后的键值。 例如:我有一个表的属性名称和ID。 id是生成的值。

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

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

我们正在使用Microsoft SQL Server 2008。

不需要单独的SELECT …

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

这也适用于非IDENTITY列(如GUID)

使用SCOPE_IDENTITY()获取新的ID值

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

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

entity framework执行类似于gbn的答案:

 DECLARE @generated_keys table([Id] uniqueidentifier) INSERT INTO Customers(FirstName) OUTPUT inserted.CustomerID INTO @generated_keys VALUES('bob'); SELECT t.[CustomerID] FROM @generated_keys AS g JOIN dbo.Customers AS t ON g.Id = t.CustomerID WHERE @@ROWCOUNT > 0 

输出结果存储在临时表variables中,然后select回客户端。 必须知道这个问题:

插入可以生成多个行,所以variables可以包含多个行,所以可以返回多个ID

我不知道为什么EF会内部join短暂的表回到真正的表(在什么情况下,两者不匹配)。

但这就是EF所做的。

SQL Server 2008或更新版本。 如果是2005年,那么你运气不好。

你可以使用scope_identity来select刚刚插入到variables中的行的ID,然后从该表中select你想要的任何列,其中id =从scope_identity

看到这里的MSDN信息http://msdn.microsoft.com/en-us/library/ms190315.aspx

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

当插入到在SQL Server中使用ID作为标识列的表中时,这就是我如何使用OUTPUT INSERTED:

 'myConn is the ADO connection, RS a recordset and ID an integer Set RS=myConn.Execute("INSERT INTO M2_VOTELIST(PRODUCER_ID,TITLE,TIMEU) OUTPUT INSERTED.ID VALUES ('Gator','Test',GETDATE())") ID=RS(0) 

*连接string中的参数顺序有时很重要。 *提供者参数的位置可以在添加一行之后破坏logging集游标。 我们看到了SQLOLEDB提供者的这种行为。

添加行后,行字段不可用,除非将连接string中的第一个参数指定为提供程序。 当提供程序位于连接string中除第一个参数以外的任何位置时,新插入的行字段不可用。 当我们将提供者移动到第一个参数时,奇怪的是行字段出现了。

在对具有标识列的表进行插入后,可以引用@@ IDENTITY以获取值: http : //msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx