0

可能重复:
使用 @@identity 而不是 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 字段。

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

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

4

5 回答 5

1
  1. scope_identity() 用于会话
  2. 使用OUTPUT子句,如果您有一个操作/创建 id 的子句,它将在触发后获取 id
于 2012-10-08T10:00:48.227 回答
0
  1. 该值是会话本地的,因此如果不同的用户同时添加记录,则没有问题。

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

于 2012-10-08T10:04:56.250 回答
0

据我了解,您这样做的方式是“最佳”方式,并将从当前事务返回 INSERTed 行的 ID 。

于 2012-10-08T09:58:43.757 回答
0

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

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

于 2012-10-08T09:58:55.420 回答
0

它与当前会话+当前语句相关

于 2012-10-08T10:00:23.250 回答