none
Select onde o Join vem de bancos e tabelas diferentes RRS feed

  • Pergunta

  • Pessoal, preciso fazer uma consulta só que o join pode ser feito com databases, tabelas diferentes. Eis um exemplo

    Tabela Debitos

     

    Codigo_Origem Cadastro

    1             012030

    2             034040

    3             056060

     

    Criei uma tabela de parametro para saber onde tenho que buscar o nome do meu cliente. Exemplo 

     

    Codigo_Origem    Banco_Dados  Tabela     Coluna     Coluna_Nome

    1                Cliente      Cliente    Codigo     Nome_Cliente

    2                Parceiro     Parc       Codigo_P   Nome 

    3                Fornecedor   Forneced   Inscricao  Razao_Social 

     

    No primeiro registro, por exemplo, eu devo buscar o nome no banco de dados cliente, na tabela cliente, fazendo join de Cadastro com Codigo, retornando a coluna nome_cliente 

     

    Tem como eu fazer este select?

    sexta-feira, 15 de julho de 2011 12:40

Respostas

  • Danilo,

    Seria algo +/- assim

    declare @tbOrigem table (Codigo_Origem int, Cadastro varchar(10))
    insert into @tbOrigem values (1,'012030'),(2,'034040'),(3,'056060')
    
    declare @tbParametro table (Codigo_Origem int, Banco_Dados varchar(20), Tabela varchar(20), Coluna varchar(20), Coluna_Nome varchar(20))
    insert into @tbParametro values(1,'Cliente','Cliente','Codigo','Nome_Cliente')
    ,(2,'Parceiro','Parc','Codigo_P','Nome') 
    ,(3,'Fornecedor','Forneced','Inscricao','Razao_Social')
    
    declare @strSQL varchar(max)
    select @strSQL='SELECT '+a.Coluna +','+ a.Coluna_Nome +' FROM '+a.Banco_Dados+'..'+a.Tabela+' WHERE '+a.coluna+' = '+ b.Cadastro
    FROM @tbParametro a inner join @tbOrigem b on a.Codigo_Origem=b.Codigo_Origem
    WHERE a.Codigo_Origem=1
    
    --print @STRSQL
    exec(@STRSQL)
    

     

    Att.
    Marcelo Fernandes


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

    • Marcado como Resposta Danilo Rogério sexta-feira, 15 de julho de 2011 18:32
    sexta-feira, 15 de julho de 2011 13:29

Todas as Respostas

  • Danilo,

     

    Se forem apenas bases diferentes:

    SELECT a.*, b.*

    FROM Base1.dbo.Tabela1 a INNER JOIN Base2.dbo.Tabela2 b on (a.CampoPK=b.CampoFK)

     

    Se forem instancias diferentes:

    Crie um linked server para a outra instancia e:

    SELECT a.*, b.*

    FROM LInkedServer.Base1.dbo.Tabela1 a INNER JOIN Base2.dbo.Tabela2 b on (a.Campo1=b.Campo2)


    Fabrizzio A. Caputo
    Certificações: Oracle OCA 11g, MCITP SQL Server 2008 Implementation and Maintenance
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    sexta-feira, 15 de julho de 2011 12:47
    Moderador
  • Fabrizzio, o join não é simples assim.

    Veja que quando o Codigo_Origem for 1 eu vou em um banco, tabela e coluna diferente para fazer o join

    Quando o Codigo_Origem for 2, vou noutro lugar, e assim por diante.

    A princípio não queria fazer um Case e montar um select para cada situacao, pensei em fazer isso dinamicamente utilizando a tabela de parâmetro.

    Entendeu?

    sexta-feira, 15 de julho de 2011 12:51
  • Danilo,

    Se entendi o que vc quer vc terá que fazr query dinâmica

    Att.
    Marcelo Fernandes


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

    sexta-feira, 15 de julho de 2011 13:01
  • Danilo,

    Seria algo +/- assim

    declare @tbOrigem table (Codigo_Origem int, Cadastro varchar(10))
    insert into @tbOrigem values (1,'012030'),(2,'034040'),(3,'056060')
    
    declare @tbParametro table (Codigo_Origem int, Banco_Dados varchar(20), Tabela varchar(20), Coluna varchar(20), Coluna_Nome varchar(20))
    insert into @tbParametro values(1,'Cliente','Cliente','Codigo','Nome_Cliente')
    ,(2,'Parceiro','Parc','Codigo_P','Nome') 
    ,(3,'Fornecedor','Forneced','Inscricao','Razao_Social')
    
    declare @strSQL varchar(max)
    select @strSQL='SELECT '+a.Coluna +','+ a.Coluna_Nome +' FROM '+a.Banco_Dados+'..'+a.Tabela+' WHERE '+a.coluna+' = '+ b.Cadastro
    FROM @tbParametro a inner join @tbOrigem b on a.Codigo_Origem=b.Codigo_Origem
    WHERE a.Codigo_Origem=1
    
    --print @STRSQL
    exec(@STRSQL)
    

     

    Att.
    Marcelo Fernandes


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

    • Marcado como Resposta Danilo Rogério sexta-feira, 15 de julho de 2011 18:32
    sexta-feira, 15 de julho de 2011 13:29
  • Marcelo, é possível colocar este código dentro de uma View? Pois tentei criar variável dentro do corpo dela e parece não ser possível

     

     

    sexta-feira, 15 de julho de 2011 14:02
  • não... vc não consegue executar query dinâmica em uma view... somente em proc e como script mesmo...

    mas se vc relamente precisa construir um script com query dinâmica, vc pode inserir os reusltados da query dinamica em uma tabela temporaria e ai fazer o join..

    Att.
    Marcelo Fernandes


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


    sexta-feira, 15 de julho de 2011 17:13
  • A View me facilitaria um bocado, pois faria os joins dentro de meu sistema. Mesmo assim, muito obrigado. Em procedures já vai ajudar
    sexta-feira, 15 de julho de 2011 18:31