Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Impedisci ad Access di utilizzare un'identità errata durante l'aggiunta alla tabella collegata sul server SQL

Una traccia ODBC rivela che Access sta effettivamente chiamando SELECT @@IDENTITY (al contrario di SCOPE_IDENTITY() ) dopo aver inserito la riga nella tabella collegata di SQL Server:

Database1       e00-1490    EXIT  SQLExecDirectW  with return code 0 (SQL_SUCCESS)
        HSTMT               0x00000000004D6990
        WCHAR *             0x000000000F314F28 [      -3] "INSERT INTO  "dbo"."Table1"  ("txt") VALUES (?)\ 0"
        SDWORD                    -3

...

Database1       e00-1490    EXIT  SQLExecDirectW  with return code 0 (SQL_SUCCESS)
        HSTMT               0x00000000004D6990
        WCHAR *             0x000007FED7E6EE58 [      -3] "SELECT @@IDENTITY\ 0"
        SDWORD                    -3

Inoltre, questo comportamento sembra dipendere dal driver ODBC utilizzato, poiché un test simile con MySQL Connector/ODBC mostra che Access non chiama la funzione MySQL corrispondente LAST_INSERT_ID() dopo aver inserito una riga in una tabella collegata a MySQL.

Dato che Access sta chiamando SELECT @@IDENTITY , dobbiamo modificare il nostro trigger come segue (fonte: qui ) per ripristinare il valore @@IDENTITY al suo valore originale

create trigger mytable_insert_trigger on mytable for insert as

declare @identity int
declare @strsql varchar(128)

set @[email protected]@identity
--your code
--insert into second table ...
--your code
set @strsql='select identity (int, ' + cast(@identity as varchar(10)) + ',1) as id into #tmp'
execute (@strsql)