Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Empêcher Access d'utiliser une mauvaise identité lors de l'ajout à la table liée sur le serveur SQL

Une trace ODBC révèle qu'Access appelle en effet SELECT @@IDENTITY (par opposition à SCOPE_IDENTITY() ) après avoir inséré la ligne dans la table liée 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

De plus, ce comportement semble dépendre du pilote ODBC utilisé, car un test similaire avec MySQL Connector/ODBC montre qu'Access n'appelle pas la fonction MySQL correspondante LAST_INSERT_ID() après avoir inséré une ligne dans une table liée MySQL.

Étant donné qu'Access appelle SELECT @@IDENTITY , nous devons modifier notre déclencheur comme suit (source : ici ) pour réinitialiser la valeur @@IDENTITY à sa valeur d'origine

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)