none
Conexão com tabelas de outro servidor RRS feed

  • Pergunta

  • Olá Pessoal.

    Galera eu estou precisando criar uma function que seleciona três valores e um desses três valores está contido em uma tabela de um outro servidor. Diante dessa situação eu pesquisei os procedimentos e acabei encontrando dois, um usando SP_AddLinkedServer e outro usando OpenRowSet , então montei o script, só que está dando dois erros (um em cada procedimento), seguem os exemplos abaixo

    1. SELECT A.* FROM OPENROWSET('SQLNCLI', 'Server=192.XXX.X.XX;UserID=user;PWD=1234567890;',
           'SELECT * FROM DataBase.Schema.TABELA') AS A

      ERRO: Msg 7399, Level 16, State 1, Line 1
      The OLE DB provider "SQLNCLI" for linked server "(null)" reported an error. Authentication failed.
      Msg 7303, Level 16, State 1, Line 1
      Cannot initialize the data source object of OLE DB provider "SQLNCLI" for linked server "(null)".
    2. IF EXISTS(SELECT NAME FROM sys.servers WHERE NAME = '192.XXX.X.XX')
        EXEC sp_dropserver '192.XXX.X.XX', 'DROPLOGINS'
      GO
      EXEC sp_addlinkedserver @server = '192.XXX.X.XX', @srvproduct = '', @provider = 'msdasql', @provstr = 'DRIVER={SQL Server};SERVER=192.XXX.X.XX;UID=user;PWD=1234567890;'
      GO
      SET ANSI_NULLS ON
      SET ANSI_WARNINGS ON
      GO
      SELECT * FROM [192.XXX.X.XX].DataBase.Schema.TABELA
      GO

      ERRO: Msg 7403, Level 16, State 1, Line 1
      The OLE DB provider "msdasql" has not been registered.

    Onde 192.XXX.X.XX é o servidor que está a tabela a qual preciso acessar.

    Os dados de conexão do 1° exemplo estão corretos pois uso ele pra conexão no MSSQL Studio, só se for algum problema com aspas nas strings.

    A dll msdasql.dll do 2º exemplo está na pasta C:\Arquivos de programas\Arquivos comuns\System\Ole DB e está registrada. É nesse diretório que ela tem de estar?

    Desde já agradeço a atenção

    Att.

    Leonardo (e-mail: leonardo@frisokar.com.br)

    • Tipo Alterado Gustavo Maia Aguiar segunda-feira, 7 de fevereiro de 2011 16:02 É uma dúvida e não uma discussão
    • Movido Gustavo Maia Aguiar segunda-feira, 7 de fevereiro de 2011 16:03 (De:SQL Server - Desenvolvimento Geral)
    segunda-feira, 7 de fevereiro de 2011 11:35

Respostas

  • Leonardo,

    tente o script abaixo...

    EXEC master.dbo.sp_addlinkedserver 
      @server = N'nome_do_linked', --obs 1 -- Ex. Linked_Teste
      @srvproduct=N'SQL Server', 
      @provider=N'SQLNCLI', 
      @datasrc=N'nome_do_servidor(origem)'-- obs 2
     
     -- obs1 - informe um nome para o linked (nome que será usando no select) geralmente repetimos o nome do servidor de destino
     -- obs2 - informe o nome ou ip do seu servidor de origem.... no caso o 192.XXX.X.XX
     
     -- testando
     SELECT * FROM Linked_Teste.master.sys.databases -- onde Linked_Teste é o nome do linked server criado acima...
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    segunda-feira, 7 de fevereiro de 2011 16:37
    Moderador
  • Marcelo e Junior,

    Obrigado pelas informações. Nesse caso eu consegui corrigir o 1° exemplo e deu certo. Veja como ficou:

    SELECT IsNull(COUNT(PRODUTO),0) AS TOTAL
      FROM OPENROWSET('SQLOLEDB', '192.XXX.XX.X';'user';'password','SELECT * FROM DataBase.Schema.TABELA ')
        WHERE (PRODUTO = @cProduto)
          AND (COALESCE(FLAG, '') = '')

    Obs -> Para usar a função OpenRowSet talvez seja necessário habilitar as configurações da mesma, no meu caso eu precisei, para isso executei o código seguinte:

    exec sp_configure 'show advanced options',1
    go
    reconfigure with override
    go
    exec sp_configure 'ad hoc distributed queries', 1
    go
    reconfigure with override
    go

    Att.

    Leonardo

    sexta-feira, 11 de fevereiro de 2011 10:18

Todas as Respostas

  • Leonardo,

    tente o script abaixo...

    EXEC master.dbo.sp_addlinkedserver 
      @server = N'nome_do_linked', --obs 1 -- Ex. Linked_Teste
      @srvproduct=N'SQL Server', 
      @provider=N'SQLNCLI', 
      @datasrc=N'nome_do_servidor(origem)'-- obs 2
     
     -- obs1 - informe um nome para o linked (nome que será usando no select) geralmente repetimos o nome do servidor de destino
     -- obs2 - informe o nome ou ip do seu servidor de origem.... no caso o 192.XXX.X.XX
     
     -- testando
     SELECT * FROM Linked_Teste.master.sys.databases -- onde Linked_Teste é o nome do linked server criado acima...
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    segunda-feira, 7 de fevereiro de 2011 16:37
    Moderador
  • Leonardo,

    Primeiro você deverá criar o linkedserver entre estes dois servidores, especificando uma conta de usuário que tenha permissão de acesso entre ambos os servidores.

    Após criar o linked server será possível realizar este Select através do OpenRowSet.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    segunda-feira, 7 de fevereiro de 2011 16:39
    Moderador
  • Marcelo e Junior,

    Obrigado pelas informações. Nesse caso eu consegui corrigir o 1° exemplo e deu certo. Veja como ficou:

    SELECT IsNull(COUNT(PRODUTO),0) AS TOTAL
      FROM OPENROWSET('SQLOLEDB', '192.XXX.XX.X';'user';'password','SELECT * FROM DataBase.Schema.TABELA ')
        WHERE (PRODUTO = @cProduto)
          AND (COALESCE(FLAG, '') = '')

    Obs -> Para usar a função OpenRowSet talvez seja necessário habilitar as configurações da mesma, no meu caso eu precisei, para isso executei o código seguinte:

    exec sp_configure 'show advanced options',1
    go
    reconfigure with override
    go
    exec sp_configure 'ad hoc distributed queries', 1
    go
    reconfigure with override
    go

    Att.

    Leonardo

    sexta-feira, 11 de fevereiro de 2011 10:18
  • Leonardo,

    Obrigado pelo retorno..
    Se possível marque a(s) resposta(s) que lhe ajudou, esta ação poderá ajudar outros usuários do forum.

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    sexta-feira, 11 de fevereiro de 2011 11:14
    Moderador