Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verhindern Sie, dass Access beim Anhängen an eine verknüpfte Tabelle auf dem SQL-Server eine falsche Identität verwendet

Ein ODBC-Trace zeigt, dass Access tatsächlich SELECT @@IDENTITY aufruft (im Gegensatz zu SCOPE_IDENTITY() ) nach dem Einfügen der Zeile in die verknüpfte SQL Server-Tabelle:

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

Außerdem scheint dieses Verhalten vom verwendeten ODBC-Treiber abhängig zu sein, da ein ähnlicher Test mit MySQL Connector/ODBC zeigt, dass Access die entsprechende MySQL-Funktion LAST_INSERT_ID() nicht aufruft nach dem Einfügen einer Zeile in eine mit MySQL verknüpfte Tabelle.

Vorausgesetzt, Access ruft SELECT @@IDENTITY auf , müssen wir unseren Trigger wie folgt ändern (Quelle: hier ), um den @@IDENTITY-Wert auf seinen ursprünglichen Wert zurückzusetzen

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)