none
Insert tabela remote procedure resultado RRS feed

  • Pergunta

  • Olá amigos.

    Estou utilizado a seguinte estrutura em batch para diversos servidores  a fim de inserir em uma tabela centralizada algumas informações:

    USE ***
    GO
    DECLARE @SQLString nvarchar(500);
    declare @srv sysname

    set @srv = 'servidores***'
    set @SQLString = 'exec OPENDATASOURCE(''SQLOLEDB'',''Data Source='+@SRV+';UserID=user;Password="senha"'').banco.dbo.Sp_CHECA_AGENT_STATUS'

    insert bancolocal.DBO.tabelalocal_temp
    exec sp_executesql @SQLString

    Para exibir o resultado da procedure não ocorre erro. O problema ocorre no insert.

    OLE DB provider "SQLNCLI10" for linked server "(null)" returned message "No transaction is active.".
    Msg 7391, Level 16, State 2, Line 1
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "(null)" was unable to begin a distributed transaction.

    Grato pelo ajuda.

    sábado, 31 de janeiro de 2015 09:15

Respostas

  • Senhores, grato pelas respostas.

    Via opendatasourcer ainda não consigo insert do resultado em tabela. Estranhamente após deletar o linked server e adiciona-lo e  colocar o rpc e rpcout true via linked server estou conseguindo realizar o insert.

    Acabei utilizando um IF() em minha aplicação para esse servidor específico utilizar linked server. 

    Acredito que seja algo no msdtc desse meu servidor descentralizado, infelizmente não tenho permissão para reinstalar.

    Desde já agradeço. Apoio infelizmente vai ficar essa gambiarra por enquanto.

    quinta-feira, 5 de fevereiro de 2015 05:38

Todas as Respostas

  • Marcelo,

    Para executar uma procedure que está em um banco de dados de outra instância SQL é preciso que seu linkedserver esteja com às configurações RCP habilitadas.

    Abra o SSMS, selecione "Server Objects" => "Linked Servers" e selecione o LinkedServer que você criou. Clique com o botão direito em "Properties". Na janela, selecione a aba "Server Options" e habilite as opções de RPC. Veja na imagem abaixo:

    Então basta executar a instrução como indicado no exemplo abaixo:

    USE SeuBanco
    GO
    
    --EXEMPLO EXECUTANDO O SCRIPT NO SERVIDOR DE PRODUÇÃO
    INSERT INTO TB_PESSOA (CD_PESSOA, NM_PESSOA)
    EXEC [SeuLinkedServer].SeuBanco.dbo.SuaProcedure 1, 'teste';
    GO

    Para maiores informações veja:

    http://msdn.microsoft.com/en-us/library/ff772782.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    segunda-feira, 2 de fevereiro de 2015 16:13
    Moderador
  • Durval Ramos, obrigado pela resposta.

    Porém as configurações do RPC  e RPC OUT estão habilitadas. Mesmo assim , ao utilizar openquery,opendatasource, ou linked server só é possivél ver o retorno. Ao tentar inserir em tabela o erro acontece.

    Estranhamente  se utilizo essa rotina  do centralizado para os distribuidos e apenas neste servidor específico esta ocorrendo erro.

    terça-feira, 3 de fevereiro de 2015 03:01
  • Marcelo,

         Se esse problema só acontece neste servidor, o problema pode ser o MSDTC (Iniciar, Ferramentas Administrativas, Serviços de Componente, Computadores, Meu Computador, Coordenador de transações distribuidas, DTC Local) Verifique se está corretamente configurado... Verifique como esta configuração foi feita nos outros servidores para fazer semelhante...


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    terça-feira, 3 de fevereiro de 2015 03:39
    Moderador
  • Olá Marcelo

    se o problema persistir após as recomendações que o Roberto e o Durval comentaram, verifique este artigo que escrevi so o "no transaction is active"

    http://social.technet.microsoft.com/wiki/contents/articles/5141.solucionando-problemas-no-transaction-is-active-no-sql-server-pt-br.aspx

    no caso do artigo esta mais ligado a latencia de link, se vc esta fazendo uma transacao entre sites bem remotos isto pode ocorrer dependendo da qualidade de seu link.

    outro motivo são os firewalls, os dois ambientes estão na mesma VLAN? faça um teste de telnet nos dois senditos na porta 135 e na porta do MSDTC (você precisa descobrir com o netstat -oan pegando o pid do processo do MSDTC)

     


    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS, MCITP, MCT e MVP.
    Se Útil, classifique!!!
    Me siga no twitter: @marcelodba

    terça-feira, 3 de fevereiro de 2015 12:10
    Moderador
  • Marcelo Diegues,

    Um detalhe é importante, você esta executando sua Stored Procedure através do commando Exec, por padrão quando o Exec é executado o SQL Server criar em tempo de execução uma nova sessão para processar a Stored Procedure.

    Neste caso, o que pode estar acontecendo é que as variáveis que você esta utilizando no SP_ExecuteSQL não estão sendo reconhecidas dentro da sessão que o Exec esta criando, faça um teste, tente executar utilizando o comando Execute antes do SP_ExecuteSQL.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 4 de fevereiro de 2015 13:27
  • Senhores, grato pelas respostas.

    Via opendatasourcer ainda não consigo insert do resultado em tabela. Estranhamente após deletar o linked server e adiciona-lo e  colocar o rpc e rpcout true via linked server estou conseguindo realizar o insert.

    Acabei utilizando um IF() em minha aplicação para esse servidor específico utilizar linked server. 

    Acredito que seja algo no msdtc desse meu servidor descentralizado, infelizmente não tenho permissão para reinstalar.

    Desde já agradeço. Apoio infelizmente vai ficar essa gambiarra por enquanto.

    quinta-feira, 5 de fevereiro de 2015 05:38