Come impedire che una query di inserimento venga registrata in una transazione distribuita?
-
09-06-2019 - |
Domanda
Ho una query di inserimento SQL all'interno di un processo memorizzato, per inserire righe in un file server collegato tavolo.
Poiché la procedura memorizzata viene chiamata all'interno di una transazione principale, questa istruzione Insert tenta di utilizzare un DTC per inserire righe nel server collegato.
Vorrei Evitare DTC dall'essere coinvolto.
Esiste un modo per farlo (come un suggerimento) affinché l'istruzione Inserisci SQL ignori l'ambito transazionale?
Soluzione
Il mio suggerimento è di archiviare tutto ciò che si desidera inserire in una tabella di staging e, una volta terminata la procedura, eseguire l'inserimento tra server.Per quanto ne so, non c'è modo di ignorare la transazione in cui ti trovi una volta che sei all'interno dell'esecuzione SProc.
Al contrario, se si utilizza lo spazio dei nomi System.Transaction di .NET 2.0, è possibile indicare a istruzioni specifiche di non partecipare ad alcuna transazione con ambito padre.Ciò richiederebbe di scrivere parte della logica in codice anziché in procedure memorizzate, ma funzionerebbe.
Ecco un collegamento pertinente.
Buona fortuna, Alan.
Altri suggerimenti
Prova a utilizzare OpenQuery per chiamare la query/SP del server collegato invece di chiamare diretta che ha funzionato per me
Quindi invece di inserire in ...selezionare * da mylinkedserver.pubs.dbo.authors
per esempio.Dichiara @tsql varchar (8000), @var char (2) seleziona @var = 'ca' seleziona @tsql = 'seleziona * da openQuery (mylinkedserver,' 'seleziona * da pubs.dbo.authors dove lo stato =' '' ' ' + @Var +' '' '' '') '
INSERIRE .....EXEC (@TSQL)