T-SQL EXEC和范围

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.:(

Jho*_*re- 6

尝试

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)


mar*_*c_s 5

根据微软的 T-SQL 文档:

IDENT_CURRENT 与 SQL Server 2000 标识函数 SCOPE_IDENTITY 和 @@IDENTITY 类似。所有三个函数都返回最后生成的标识值。但是,这些函数中定义的最后一个范围和会话有所不同:

IDENT_CURRENT 返回为任何会话和任何范围中的特定表生成的最后一个标识值。

@@IDENTITY 返回为当前会话中所有范围内的任何表生成的最后一个标识值。

SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表生成的最后一个标识值。

所以我想说,不,IDENT_CURRENT 不能保证给你返回正确的值。它可能是在不同会话中插入的最后一个 IDENTITY 值。

我会确保使用 SCOPE_IDENTITY 来代替 - 这应该可靠地工作。

马克