【问题标题】:Can SCOPE_IDENTITY return value after another user's InsertSCOPE_IDENTITY 能否在其他用户插入后返回值
【发布时间】:2019-12-23 11:17:34
【问题描述】:

在多用户系统上工作,如果另一个用户在我之后立即插入一行,下面的代码是否有可能获取 id 值?

INSERT INTO table (ross) 
VALUES('whatever');

SELECT SCOPE_IDENTITY;

如果是这样,我有什么办法可以保证用户从他/她刚刚输入的记录中取回id?

【问题讨论】:

  • 我添加了 sql-server 标签,因为问题似乎与 SQL Server 有关。
  • NO _ SCOPE_IDENTITY 仅限于 您的 范围 - 例如您的事务和与 SQL Server 的连接。它不受其他连接/用户在同一个表中插入值的影响

标签: sql sql-server visual-studio


【解决方案1】:

不要使用SCOPE_IDENTITY 或任何其他单值机制。

使用OUTPUT:

DECLARE @ids TABLE (id int);

INSERT INTO table (ross)
    OUTPUT inserted.id INTO @ids  -- use correct column name
    VALUES ('whatever');

SELECT *
FROM ids;

注意:

  • 这适用于要插入的任意数量的行。
  • 这保证您只取回语句实际插入的行的值。
  • 即使在表上定义了触发器,这仍然有效。
  • 您可以删除INTO 并获取从INSERT 返回的结果。

【讨论】:

  • 对于单例插入,scope_identity 工作得很好 - 并且多年来一直如此。
  • @Smor 。 . .否决票意味着这个答案是不正确的。这似乎完全没有根据。 OUTPUT 是执行 OP 想要的最安全的方式——它适用于所有情况。
  • 赞成答案,因为 scope_identity 完全没有使用插入触发器而不是插入触发器
猜你喜欢
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多