Comment empêcher une requête d'insertion de s'inscrire dans une transaction distribuée?
-
09-06-2019 - |
Question
J'ai une requête d'insertion SQL dans un proc stocké, pour l'insertion de lignes dans une table de serveur lié .
Etant donné que le proc stocké est appelé dans une transaction parente, cette instruction Insert tente d'utiliser un DTC pour insérer des lignes dans le serveur lié.
Je souhaite éviter à DTC de s'impliquer.
Existe-t-il un moyen (par exemple, un conseil) pour que l'instruction Insert SQL ignore la portée transactionnelle?
La solution
Je suggère que vous stockiez ce que vous voulez insérer dans une table de transfert, puis une fois la procédure terminée, lancez l'insertion entre serveurs. À ma connaissance, il n'y a aucun moyen d'ignorer la transaction dans laquelle vous vous trouvez une fois que vous êtes dans l'exécution de SProc.
En revanche, si vous utilisez l'espace de noms System.Transaction de .NET 2.0, vous pouvez indiquer à des instructions spécifiques de ne participer à aucune transaction d'étendue parent. Cela vous obligerait à écrire une partie de votre logique dans le code plutôt que dans les procédures stockées, mais cela fonctionnerait.
Voici un lien pertinent .
bonne chance, Alan.
Autres conseils
Essayez d'utiliser openquery pour appeler la requête / sp du serveur lié au lieu d'appeler directement Cela a fonctionné pour moi
donc au lieu de insérer dans ... select * from mylinkedserver.pubs.dbo.authors
par exemple. DECLARE @TSQL varchar (8000), @VAR char (2) SELECT @VAR = 'CA' SELECT @TSQL = 'SELECT * FROM OPENQUERY (MyLinkedServer,' 'SELECT * FROM pubs.dbo.authors WHERE state =' '' '' +'VAR + '' '' '' '') '
INSERT INTO ..... EXEC (@TSQL)