sql - 为什么 SCOPE_IDENTITY 返回 NULL?

标签 sql sql-server tsql

我有一个存储过程,它采用@dbName并在该数据库中插入记录。 我想获取最后插入的记录的ID。 SCOPE_IDENTITY() 返回 NULL 而 @@IDENTITY 返回正确的 id,为什么会发生这种情况?正如我所读到的,所以最好使用 SCOPE_IDENTITY() 以防表上有一些触发器。 我可以使用 IDENT_CURRENT 吗?无论触发器如何,它都会返回表范围内的 id 吗?

那么问题是什么以及使用什么?

已编辑

DECALRE @dbName nvarchar(50) = 'Site'
DECLARE @newId int
DECLARE @sql nvarchar(max)
SET @sql = N'INSERT INTO ' + quotename(@dbName) + N'..myTbl(IsDefault) ' +
           N'VALUES(0)'     
EXEC sp_executesql @sql

SET @newId = SCOPE_IDENTITY()

最佳答案

就像 Oded 所说,问题在于您在执行插入之前询问身份。

作为解决方案,最好尽可能靠近 insert 运行 scope_identity。通过使用带有输出参数的 sp_executesql,您可以将 scope_identity 作为动态 SQL 语句的一部分运行:

SET @sql = N'INSERT INTO ' + quotename(@dbName) + N'..myTbl(IsDefault) ' +
           N'VALUES(0) ' +
           N'SET @newId = SCOPE_IDENTITY()'
EXEC sp_executesql @sql, N'@newId int output', @newId output

这是一个example at SE Data显示 scope_identity 应该位于 sp_executesql 内。

关于sql - 为什么 SCOPE_IDENTITY 返回 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7298030/

相关文章:

SQL Server While 循环获取每月最后一天

sql-server - T-SQL 通过存储过程选择、操作和重新插入

sql - MS SQL 查询获取表中多次出现的所有条目,其中某些列值没有条目

sql - 如何测试SQL脚本? (数据完整性/迁移测试)

mysql - 用户定义的变量不适用于 where 子句

sql - 为什么 RAND() 不产生随机数?

SQL 语句

sql - MS SQL 临时表

java - 返回插入的 id Oracle 时并非所有变量都绑定(bind)

sql - 为 SQL 表类型插入批量记录时获取 SCOPE_IDENTITY 值