T-SQL SCOPE_IDENTITY() vs @@IDENTITY
SCOPE_IDENTITY() e @@IDENTITY sono due istruzioni T-SQL che permettono di recuperare l'ultimo valore di identity generato dopo una INSERT.
La differenza tra i due è che @@IDENTITY ritorna l'ultimo valore di identity inserito relativo alla connessione corrente. Questo vuol dire che, ad esempio, se ho un trigger sulla tabella il valore di identity ritornato non sarà quello della tabella dove ho eseguito la insert ma quello relativo all'ultima istruzione di insert presente nel trigger.
SCOPE_IDENTITY() invece ritorna l'ultimo valore di identity nello scope corrente, quindi eventuali insert presenti in un un trigger non vengono presi in considerazione.
Salvo rari casi, conviene sempre usare SCOPE_IDENTITY():
La differenza tra i due è che @@IDENTITY ritorna l'ultimo valore di identity inserito relativo alla connessione corrente. Questo vuol dire che, ad esempio, se ho un trigger sulla tabella il valore di identity ritornato non sarà quello della tabella dove ho eseguito la insert ma quello relativo all'ultima istruzione di insert presente nel trigger.
SCOPE_IDENTITY() invece ritorna l'ultimo valore di identity nello scope corrente, quindi eventuali insert presenti in un un trigger non vengono presi in considerazione.
Salvo rari casi, conviene sempre usare SCOPE_IDENTITY():
T-SQL
DECLARE @Tbl TABLE (
[ID] int IDENTITY(1,1),
[Description] nvarchar(50)
);
DECLARE @NEWID int;
INSERT INTO @Tbl Values('Milano');
INSERT INTO @Tbl Values('Roma');
-- SET @NEWID = @@IDENTITY;
SET @NEWID = SCOPE_IDENTITY();
SELECT *
FROM @Tbl
ORDER BY [ID];
SELECT @NEWID; --- ritorna 2