Digamos que tengo un procedimiento almacenado con esto en su cuerpo:T-SQL EXEC y alcance
EXEC 'INSERT INTO ' + quotename(@table) ' blah...'
SELECT IDENT_CURRENT('' + @table + '')
Es IDENT_CURRENT() garantizado para conseguir la identidad de esa fila insertada en el EXEC? IDENT_CURRENT() "devuelve el último valor de identidad generado para una tabla específica en cualquier sesión y cualquier ámbito", pero el alcance es diferente dentro del EXEC que el procedimiento almacenado, ¿verdad?
Quiero asegurarme de que si se llama al procedimiento almacenado varias veces a la vez, se SELECCIONE la identidad correcta.
EDIT: ¿O tengo que hacer tanto el INSERT y SELECT en el EXEC, así:
declare @insert nvarchar
set @insert =
'INSERT INTO ' + quotename(@table) ' blah...' +
'SELECT IDENT_CURRENT(''' + @table + ''')'
EXEC @insert
Y si ese es el caso, ¿Cómo se selecciona el resultado de la EXEC si quiero continuar con más código en T-SQL? Como esto (aunque obviamente no es correcta):
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
ACTUALIZACIÓN: En el primer fragmento, si selecciono SCOPE_IDENTITY() en lugar de utilizar IDENT_CURRENT(), NULL es devuelto por el SELECT. :(
Sugerimos que use la segunda. @@ Identidad casi nunca debe usarse ya que a menudo no dará resultados correctos. Felicitaciones por reconocer que la identidad del ámbito debe estar en la declaración del ejecutivo. – HLGEM