cor*_*ore 5 sql t-sql identity scope
假设我的主体中有一个存储过程:
EXEC 'INSERT INTO ' + quotename(@table) ' blah...'
SELECT IDENT_CURRENT('' + @table + '')
Run Code Online (Sandbox Code Playgroud)
IDENT_CURRENT()是否保证在EXEC中获得该行的标识?IDENT_CURRENT()"返回在任何会话和任何范围内为特定表生成的最后一个标识值",但EXEC中的范围与存储过程不同,对吧?
我想确保如果一次多次调用存储过程,则选择正确的标识.
编辑:或者我需要在EXEC中同时执行INSERT和SELECT,如下所示:
declare @insert nvarchar
set @insert =
'INSERT INTO ' + quotename(@table) ' blah...' +
'SELECT IDENT_CURRENT(''' + @table + ''')'
EXEC @insert
Run Code Online (Sandbox Code Playgroud)
如果是这种情况,如果我想在T-SQL中继续使用更多代码,如何选择EXEC的结果?像这样(虽然它显然不正确):
declare @insert nvarchar
set @insert =
'INSERT INTO ' + quotename(@table) ' blah...' +
'SELECT IDENT_CURRENT(''' + @table + ''')'
declare @ident int
set @ident = EXEC @insert
-- more code
SELECT * FROM blah
Run Code Online (Sandbox Code Playgroud)
更新:在第一个片段中,如果我SELECT SCOPE_IDENTITY()而不是使用IDENT_CURRENT(),则SELECT返回NULL.:(
尝试
EXEC 'INSERT INTO ' + quotename(@table) ' blah...; SELECT @@IDENTITY'
Run Code Online (Sandbox Code Playgroud)
或者更好的,按照本
EXEC 'INSERT INTO ' + quotename(@table) ' blah...; SELECT SCOPE_IDENTITY()'
Run Code Online (Sandbox Code Playgroud)
根据微软的 T-SQL 文档:
IDENT_CURRENT 与 SQL Server 2000 标识函数 SCOPE_IDENTITY 和 @@IDENTITY 类似。所有三个函数都返回最后生成的标识值。但是,这些函数中定义的最后一个范围和会话有所不同:
IDENT_CURRENT 返回为任何会话和任何范围中的特定表生成的最后一个标识值。
@@IDENTITY 返回为当前会话中所有范围内的任何表生成的最后一个标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表生成的最后一个标识值。
所以我想说,不,IDENT_CURRENT 不能保证给你返回正确的值。它可能是在不同会话中插入的最后一个 IDENTITY 值。
我会确保使用 SCOPE_IDENTITY 来代替 - 这应该可靠地工作。
马克