本体にこれを含むストアドプロシージャがあるとしましょう:
EXEC 'INSERT INTO ' + quotename(@table) ' blah...'
SELECT IDENT_CURRENT('' + @table + '')
IDENT_CURRENT() は、EXEC で挿入されたその行の ID を取得することが保証されていますか? IDENT_CURRENT() は「任意のセッションおよび任意のスコープで特定のテーブルに対して生成された最後の ID 値を返します」が、EXEC 内のスコープはストアド プロシージャとは異なりますよね?
ストアド プロシージャが一度に複数回呼び出されている場合、正しい ID が選択されていることを確認したいと考えています。
編集:または、次のように、EXEC 内で INSERT と SELECT の両方を実行する必要がありますか?
declare @insert nvarchar
set @insert =
'INSERT INTO ' + quotename(@table) ' blah...' +
'SELECT IDENT_CURRENT(''' + @table + ''')'
EXEC @insert
その場合、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
更新: 最初のスニペットで、IDENT_CURRENT() を使用する代わりに SCOPE_IDENTITY() を選択すると、SELECT によって NULL が返されます。:(