get @@ Identité d'un autre server (server lié)

J'ai un server lié, je veux append un logging à la table sur le server lié, Est-il possible de prendre @@ identité d'un autre server avec le server lié? (SQL Server 2005)

Vous pouvez créer une procédure stockée sur votre server lié qui renverra l'identité.

Vous devriez utiliser SCOPE_IDENTITY() plutôt que @@IDENTITY , d'ailleurs.

Voir cette question connexe (Meilleure façon d'get l'identité de la ligne insérée?).

À l'aide de SQL Server 2012 ici.

J'ai essayé la méthode gbn mais j'ai eu cette erreur:

 Msg 405, Level 16, State 1, Line 1 A remote table cannot be used as a DML target in a statement which includes an OUTPUT clause or a nested DML statement. 

En plus de cela, j'avais besoin d'append le SET XACT_ABORT ON; avant ma déclaration que j'utilisais des transactions dissortingbuées.

J'ai donc fini par résoudre les deux problèmes en faisant ceci:

 BEGIN DISTRIBUTED TRANSACTION SELECT idcolumn FROM OPENQUERY(MyRemoteServer, ' SET XACT_ABORT ON; INSERT INTO MyRemoteBD.dbo.SomeTable(col1,col2, ...) OUTPUT INSERTED.idcolumn VALUES (val1,val2, ...); SET XACT_ABORT OFF'); COMMIT 

Et j'ai été capable d'exécuter ceci dans une transaction dissortingbuée tout en obtenant l'identité de mon insertion.

Un comportement bizarre à propos de cette instruction est que si j'exécute l'instruction Insert sans ouvrir auparavant la transaction dissortingbuée (doit être celle dissortingbuée), elle returnnera l'identité suivante mais n'insèrera rien. Je n'ai aucune idée de pourquoi cela se passe.

Modifier:

J'ai essayé cette autre méthode et cela a fonctionné sans avoir besoin de mettre XACT_ABORT ON sur les transactions dissortingbuées et fonctionne XACT_ABORT ON sans transactions.

 exec [MyRemoteServer].MyRemoteBD.dbo.sp_executesql N' INSERT INTO SomeTable (col1,col2,...) VALUES (val1,val2,...); SELECT SCOPE_IDENTITY ()'