获得IDENTITY条插入行的最佳方法是什么?

我知道@@IDENTITYIDENT_CURRENTSCOPE_IDENTITY,但不明白它们各自的利弊.

有人能解释一下它们的区别,以及我应该在什么时候使用它们吗?

推荐答案

  • @@IDENTITY返回为当前会话中所有作用域中的任何表生成的最后一个标识值.You need to be careful here,因为它跨越范围.可以从触发器中获取值,而不是当前语句.

  • SCOPE_IDENTITY()返回为当前会话和当前作用域中的任何表生成的最后一个标识值.Generally what you want to use

  • IDENT_CURRENT('tableName')返回在任何会话和任何作用域中为特定表生成的最后一个标识值.这允许您指定要从哪个表中获取值,以防上面两个表不是您所需要的(very rare).此外,正如@Guy Starbuck所提到的,"如果您想获取尚未插入记录的表的当前标识值,可以使用此选项."

  • INSERT语句中的OUTPUT clause将允许您访问通过该语句插入的每一行.因为它的作用域是特定的语句,所以它比上面的其他函数高more straightforward.然而,它有点more verbose(您需要插入到一个表变量/temp表中,然后查询它),即使在回滚语句的错误场景中,它也会给出结果.也就是说,如果您的查询使用并行执行计划,那么这就是获取标识的方法(除了关闭并行).但是,它由before个触发器执行,不能用于返回触发器生成的值.

Sql相关问答推荐

在SQL中对字符串进行逻辑排序,将数字部分排序为数字值

为主表中的每一行查找N个最新行

Oracle中的分层查询

SQL将 Select 查询作为新列添加到另一个 Select 查询

Lag()函数的差异:R与SQL(将R代码转换为SQL)

雅典娜嵌套Json提取液

数据库SQL PARSE_SYNTAX_ERROR

使用拆分器将已分组的不同值连接在一起

根据时间、状态和相关行在PostgreSQL中的存在来删除行

除了风格之外,还有什么理由更喜欢简单的CASE WHEN而不是搜索呢?

JSON_VALUE 不适用于提取的 json 中的嵌套路径

SQL Select 字母范围没有给我任何东西

当 2 列具有静态值并且第 3 列使用运算符 IN 时,对 PostgreSQL 和 3 列上的复杂索引的最佳查询

根据不同日期标准分配组的逻辑

一次 Select 语句中按组累计的SQL累计数

如何创建一个递归计数器来查找一个元素有多少父级和子级?

COBOL\DB2作业(job)需要帮助?快来获取专业指导!

在给定的日期范围内填写缺失的日期

MIN MAX 值与条件绑定

如何对 SQL 表中的连续时间戳进行分组?