【发布时间】:2011-05-22 18:22:12
【问题描述】:
什么时候合适,应该如何在 T-SQL 中使用不同的 IDENTITY 关键字?
- 选择@@IDENTITY,
- 选择 SCOPE_IDENTITY()
- SELECT IDENT_CURRENT('tablename')
【问题讨论】:
什么时候合适,应该如何在 T-SQL 中使用不同的 IDENTITY 关键字?
【问题讨论】:
来自文章
选择@@IDENTITY
它返回最后一个 IDENTITY 值 在连接上产生,不管 产生值的表, 并且无论其范围如何 产生值的语句。 @@IDENTITY 将返回最后一个 输入到表中的标识值 您当前的会话。而@@IDENTITY 仅限于当前会话,它 不限于当前范围。 如果你的表上有一个触发器 导致在 另一张桌子,你会得到 最后创建的身份,甚至 如果它是创建它的触发器。
SELECT SCOPE_IDENTITY()
它返回最后一个 IDENTITY 值 在连接上产生并由 同一范围内的声明, 不管产生的表 价值。 SCOPE_IDENTITY(),比如 @@IDENTITY,将返回最后一个 当前创造的身份价值 会话,但它也会将其限制为 您当前的范围也是如此。其他 的话,它会返回最后一个 您明确表示的身份值 创造,而不是任何身份 由触发器或用户创建 定义函数。
SELECT IDENT_CURRENT(‘tablename’)
它返回最后一个 IDENTITY 值 在一个表中产生,无论 创造价值的联系,以及 不论范围 产生值的语句。 IDENT_CURRENT 不受范围限制 和会议;它仅限于 指定的表。 IDENT_CURRENT 返回 为 a 生成的标识值 任何会话中的特定表和任何 范围。
【讨论】:
MSDN对此有很好的参考。
简而言之,@@IDENTITY 的作用域是服务器上的当前会话(例如,如果表上的触发器也添加到具有 IDENTITY 列的表中,那么您最终可能会在 INSERT 之后检索到错误的 IDENTITY 值)。
SCOPE_IDENTITY() 将返回当前作用域的最后插入 ID,即不会给您上述问题。
IDENT_CURRENT 不限于任何会话,它返回表级别的信息(在任何会话中为该表生成的最后一个 id)
【讨论】: