Sagen wir, ich habe eine gespeicherte Prozedur mit diesem in seinem Körper:T-SQL EXEC und Umfang
EXEC 'INSERT INTO ' + quotename(@table) ' blah...'
SELECT IDENT_CURRENT('' + @table + '')
Ist IDENT_CURRENT() garantiert die Identität dieser Zeile in der EXEC eingefügt zu bekommen? IDENT_CURRENT() "gibt den letzten Identitätswert zurück, der für eine bestimmte Tabelle in jeder Sitzung und jedem Bereich generiert wurde", aber der Bereich ist innerhalb der EXEC anders als die gespeicherte Prozedur, richtig?
Ich möchte sicherstellen, dass, wenn die gespeicherte Prozedur mehrere Male auf einmal aufgerufen wird, die richtige Identität ausgewählt wird.
EDIT: Oder muss ich sowohl die INSERT tun und in der EXEC SELECT, etwa so:
declare @insert nvarchar
set @insert =
'INSERT INTO ' + quotename(@table) ' blah...' +
'SELECT IDENT_CURRENT(''' + @table + ''')'
EXEC @insert
Und wenn das der Fall ist, Wie wähle ich das Ergebnis der EXEC, wenn ich will weiter mit mehr Code in T-SQL? Wie dies (obwohl es offensichtlich nicht korrekt ist):
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
UPDATE: Gleich im ersten Schnipsel, wenn ich SELECT SCOPE_IDENTITY() anstelle von IDENT_CURRENT() NULL wird durch die SELECT zurückgegeben. :(
Dringend empfehlen Sie die zweite zu verwenden. @@ Identität sollte fast nie verwendet werden, da sie oft keine korrekten Ergebnisse liefert. Kudos zum Erkennen, dass die Bereichsidentität in der exec-Anweisung enthalten sein muss. – HLGEM