Estou usando o SQL Server 2014. Desejo executar EXEC (@remotecmd) AT [server_name];
(@remotecmd é um sql dinâmico, não um procedimento armazenado) no ##eapb
. Meu código é
insert into ##eapb
EXEC (@remotecmd) AT [ADSQLDB3S\DEV];
Mas recebo o erro:
O provedor OLE DB "SQLNCLI11" para o servidor vinculado "server_name" retornou a mensagem "O gerenciador de transações desativou seu suporte para transações remotas/de rede.".
Msg 7391, Level 16, State 2, Line 71
A operação não pôde ser executada porque o provedor OLE DB "SQLNCLI11" para o servidor vinculado "server_name" não pôde iniciar uma transação distribuída.
Se eu remover o insert into ##eapb
, não tenho erro.
O Linked Server tem a opção RPC Out definida como True .
No meu teste (para outra instância no mesmo servidor, não em um servidor separado), isso funcionou se eu tivesse a opção Linked Server de Enable Promotion of Distributed Transactions for RPC definida como "False". Você pode fazer isso através do seguinte comando:
Isso funcionou com o Coordenador de Transações Distribuídas (MSDTC) LIGADO (Em execução) e DESLIGADO (Parado).
Se você normalmente precisa da opção "promoção de transação de proc remoto" definida como "True", e se defini-la como "False" permite que isso
INSERT...EXEC
funcione, você pode configurar outro Servidor Vinculado com todas as mesmas propriedades, exceto esta opção sendo diferente.A principal desvantagem de desabilitar a "promoção trans de proc remoto" é que, bem, não é uma transação no servidor remoto . Portanto, se ocorrer um erro lá, você não obterá os dados inseridos localmente (obviamente), mas se houver alguma instrução DML executada remotamente, ela ainda poderá ser confirmada (dependendo se for uma única instrução ou várias instruções). Ainda assim, você pode / ainda deve usar o manuseio adequado de transações na consulta remota (ou seja, use a
TRY...CATCH
construção):PS A
RPC Out
opção precisa ser habilitada / True. Isso não foi mencionado acima, pois de acordo com um comentário na pergunta, essa opção já está definida corretamente.Eu posso usar:
-- Isso é tudo!!!