我试图在插入语句后得到一个键值。 例子: 我有一个表的属性名称和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。
当前回答
实体框架执行类似于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
输出结果存储在临时表变量中,然后选择返回给客户端。你必须意识到这一点:
insert可以生成多行,因此变量可以保存多行,因此可以返回多个ID
我不知道为什么EF会将临时表内部连接回实际表(在什么情况下两者会不匹配)。
但英孚就是这么做的。
仅支持SQL Server 2008或更新版本。如果是2005年,那你就不走运了。
其他回答
使用SCOPE_IDENTITY()获取新的ID值
INSERT INTO table (name) VALUES('bob');
SELECT SCOPE_IDENTITY()
http://msdn.microsoft.com/en-us/library/ms190315.aspx
建议使用SCOPE_IDENTITY()来获取新的ID值,而不是使用“OUTPUT Inserted”。ID”
如果插入语句抛出异常,我将直接抛出它。而是“输出插入”。ID”将返回0,这可能与预期不同。
有多种方法可以获取插入命令后最后插入的ID。
@@IDENTITY : It returns the last Identity value generated on a Connection in current session, regardless of Table and the scope of statement that produced the value SCOPE_IDENTITY(): It returns the last identity value generated by the insert statement in the current scope in the current connection regardless of the table. IDENT_CURRENT(‘TABLENAME’) : It returns the last identity value generated on the specified table regardless of Any connection, session or scope. IDENT_CURRENT is not limited by scope and session; it is limited to a specified table.
现在似乎更难决定哪一个能完全符合我的要求。
我更喜欢SCOPE_IDENTITY()。
如果在insert语句中使用select SCOPE_IDENTITY()和TableName,您将得到您所期望的确切结果。
来源:CodoBee
这是我如何使用输出插入,当插入到一个表,使用ID作为标识列在SQL Server:
'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)
在插入一个带有identity列的表之后,你可以引用@@IDENTITY来获取值: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx