SCOPE_IDENTITY()与会话或表相关吗?

时间:2012-10-08 09:56:12

标签: sql sql-server sql-server-2008

  

可能重复:
  Reason for using @@identity rather than scope_identity

当用户向表中添加记录时,我想返回要在插入后的页面中使用的记录的ID。我目前正在使用此命令(参见示例):

INSERT INTO tCRnames (fname, lname) VALUES ('Super','Man')
DECLARE @Id INT;
SET @Id = SCOPE_IDENTITY();
SELECT @Id;

关于这种方法我有两个问题。

  1. 此命令是否与会话相关?这意味着如果两个用户在同一时间插入记录,那么返回的ID是否会出现问题?

  2. 有没有更好的方法来返回插入的ID?目前我所有的ID都是正常的身份字段,这很好;但是我们正在考虑对我们的一些服务进行一些更改,这将使我们的ID字段不是标识字段。

  3. 然后,您将获得生成的ID,例如“TMP001-05”或“000004”。

    如何从插入中返回插入的ID(除了在生成时返回它)?

5 个答案:

答案 0 :(得分:1)

  1. scope_identity()用于会话
  2. 使用OUTPUT子句,如果你有一个操纵/创建ids的话,它将获得后触发的ids

答案 1 :(得分:0)

我的理解是,您采用的方式是“最佳”方式,并将从当前事务中返回INSERTed行的ID

答案 2 :(得分:0)

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

上的文档
  

SCOPE_IDENTITY 和@@ IDENTITY会返回 当前会话中的任何表 中生成的最后一个身份值。但是, SCOPE_IDENTITY 会返回仅在当前范围内插入的值; @@ IDENTITY不限于特定范围。

答案 3 :(得分:0)

它与当前会话+当前声明相关

答案 4 :(得分:0)

  1. 该值是会话的本地值,因此如果不同的用户同时添加记录,则没有问题。

  2. 如果没有自动生成id,那么您自己创建它,因此最简单的方法是挂起该值。您也可以使用output从插入的记录中获取值,如RichardTheKiwi建议的那样。