什么时候使用@@ IDENTITY而不是SCOPE_IDENTITY?

时间:2012-07-06 15:35:46

标签: sql-server

根据MSDN,@@IDENTITY returns the last identity value generated for any table in the current session, across all scopes.

有没有人遇到过这种功能有用的情况?当你想要为所有范围内的任何表生成最后一个ID或者如何使用它时,我想不出这种情况。

更新:

不确定所有的downvotes是什么,但我想我会试着澄清我在问什么。

首先我知道何时使用SCOPE_IDENTITY和IDENT_CURRENT。我想知道的是,与其他选项相比,何时使用@@ IDENTITY更好?我还没有找到一个在我日常工作中使用它的地方,我想知道是否有人可以描述最佳选择的情况。

大多数时候,当我看到它时,是因为有人不明白他们在做什么,但我认为微软将其包括在内是出于某种原因。

2 个答案:

答案 0 :(得分:3)

一般情况下,不应使用它。 SCOPE_IDENTITY()使用起来更安全(只要我们讨论的是单行插入,如上面的评论中所强调的那样),除了,在以下场景中{{1}是一种可以使用的方法(在这种情况下@@IDENTITY不能):

  • 你的代码故意触发触发器
  • 触发器插入带有标识列的表
  • 调用代码需要在触发器
  • 中生成的标识值
  • 调用代码可以保证触发器中生成的SCOPE_IDENTITY()值永远不会被更改以反映不同的表(例如,有人在您正依赖的插入内容后将日志添加到触发器上)

这是一个奇怪的用例,但可行。

请记住,如果要插入多行并且需要多个@@IDENTITY值,这将不起作用。还有其他方法,但它们还需要允许从游标中选择结果集的选项,并且IIRC不推荐使用此选项。

答案 1 :(得分:-2)

@@ IDENTITY非常适合根据ID列识别各行。

ID | Name | Age
1    AA     20
2    AB     30 
etc...

在这种情况下,ID列将依赖于@@ IDENTITY属性。