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()
INSERT INTO files (title) VALUES ('whatever'); SELECT * FROM files WHERE id = SCOPE_IDENTITY();
是最安全的赌注,因为有触发器的表上的OUTPUT子句冲突已知问题。 即使您的表目前没有任何触发器,这使得这相当不可靠 – 有人添加一行会破坏您的应用程序。 时间炸弹的行为。
看到msdn的文章更深入的解释:
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