ecco un esempio di come SCOPE_IDENTITY() sarà nullo, ma @@ IDENTITY avrà un valore:
inserimento in una tabella senza identità, tale tabella ha un trigger di inserimento che poi inserti in una tabella cronologia con un'identità. SCOPE_IDENTITY() sarà null (nessuna identità nell'ambito locale), ma @@ IDENTITY riporterà l'identità dal trigger.
A proposito, c'è un bug noto con SCOPE_IDENTITY(): https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811
La cosa migliore con le identità è quella di utilizzare OUTPUT INTO, è in grado di catturare una serie di ID e non è soggetto alla SCOPE_IDENTITY() bug:
declare @x table (tableID int identity not null primary key, datavalue varchar(10))
declare @y table (tableID int, datavalue varchar(10))
INSERT INTO @x values ('aaaa')
INSERT INTO @x values ('bbbb')
INSERT INTO @x values ('cccc')
INSERT INTO @x values ('dddd')
INSERT INTO @x values ('eeee')
INSERT INTO @x
(datavalue)
OUTPUT INSERTED.tableID, INSERTED.datavalue --<<<<OUTPUT INTO SYNTAX
INTO @y --<<<<OUTPUT INTO SYNTAX
SELECT
'value='+CONVERT(varchar(5),dt.NewValue)
FROM (SELECT id as NewValue from sysobjects where id<20) dt
ORDER BY dt.NewValue
select * from @x
select * from @y
fonte
2010-03-05 19:37:53
Potete fornire ulteriori dettagli ... ad es. mostra il codice in cui viene chiamato SCOPE_IDENTITY() e spiega qualsiasi altra variabile (ad es. c'è un trigger coinvolto?). –