none
uma Consulta em diversos bancos....Sql RRS feed

  • Pergunta

  • Bom galera... estou pensando eu desenvolver um rancking onde ele busque em todos os meus bancos de dados e exiba pra mim os mais consultados ... porem se conseguir fazer neste exemplo abaixo o resto eu conseguiria setar ..por exemplo....

    exitem 3 bancos ...

    Banco  araraquara 
    id        nome
    1         pedro

     Banco  matao
    id        nome
    1         manuel

    Banco  sao carlos
    id        nome
    1         tiago

    preciso de uma unica consulta Sql que faça uma busca nos tres bancos... para que exiba em meu gridview assim

    id      Nome
    1         tiago
    1         manuel
    1         pedro

     aparentemente é isso... no meu caso é muito mais complexo mas se funcionasse assim eu conseguiria resolver minha questão...

    Lembrando.. que ja abri minhas conexões...então não precisaria abri-las manualmente... tenho minhas ConnectionString configuradas.

    precisaria de uma consulta onde por exemplo.. meu Select From seria..

     " Select * From araraquara.dbo.Empresas , saocarlos.dbo.Empresas , matao.dbo.Empresas "

    só não sei o codigo correto...

    as colunas em ambos os bancos de dados são exatamente as mesmas só o que muda são os valores inseridos...

    Disposto a esclarecer duvidas.... ;D

     

    Desde já Muito Obrigado!!

     

     

    sexta-feira, 5 de novembro de 2010 14:49

Todas as Respostas

  • Jeferson,

    Vc disse que suas conexões estão abertas. E se vc fizesse assim:


    Select * From araraquara.dbo.Empresas
    union all
    Select * From saocarlos.dbo.Empresas
    union all
    Select * From matao.dbo.Empresas

    Atenderia?

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    sexta-feira, 5 de novembro de 2010 16:13
  • Hehe bom... Marco como voce sempre me ajuda... irei te explicar minha situação... parecida com a do ranking que voce me explicou perfeitamente...

    até entaum o metodo..

    SELECT     c.Cidade, COUNT(*) AS Ranking
    FROM         relatorios AS m INNER JOIN
                          Empresa AS c ON c.id = m.id
    GROUP BY c.Cidade
    ORDER BY Ranking DESC

    um ranking do modo que voce explicou da outra vez.... Porem .. digamos que eu preciso fazer um ranckin Geral onde exista 3 bancos matao, sao carlos,araraquara com os mesmos campos e colunas ...

     

    precisaria incluir nessa Query uma forma de que meu rancking fosse exibido...

    matao          2
    sao carlos    5
    araraquara  3

    ou seja eu consultaria os tres bancos... em uma consulta só.. porem sempre que eu aplico

    araraquara.dbo.Empresa  meu sistema acusa ... Invalid Object name araraquara.dbo.Empresa  naum sei o motivo ;\ tenho minhas conexões todas Corretas e naum sei a causa disso...

    ,as a gambiarra toda deveria ser mais ou menos assim..

     

     

    SELECT     c.Cidade, COUNT(*) AS Ranking
    FROM        araraquara.dbo.relatorios AS m INNER JOIN
                          araraquara.dbo.Empresa AS c ON c.id = m.id
    GROUP BY c.Cidade
    ORDER BY Ranking DESC

    e incluir um union all para unir os outros bancos... só que me falta conhecimento pra isso ;/

    Agradeco muito sua ajuda...Marco..

    Qualquer duvida em esclareço...

     

    Abraços..

     

     

     

    sábado, 6 de novembro de 2010 16:00
  • Bom Jeferson...

    O q pode estar ocorrendo é o seguinte. No SQL qdo estamos dentro de uma mesma instância as coisas funcionam que é uma beleza....

    Supondo que tenhamos uma instância com as bases:

    Jeferson1, Jeferson2 e Jeferson3

    E nelas temos as tabelas: Exemplo1, Exemplo2 e Exemplo3, respectivamente.

    Qdo estou com uma conexão aberta, independente da base conectada, dentro da instância X podemos extrair os dados assim:

    SELECT * FROM Jeferson1.dbo.exemplo1 ou SELECT * FROM Jeferson2.dbo.exemplo2 ou SELECT * FROM Jeferson3.dbo.exemplo3

    Mas tudo isso é feito dentro de uma mesma instância. Vc tem q garantir isso, q a consulta está sendo feita na mesma instância.

    Resolvido e garantindo isso, pelo erro, vc deve checar a existencia do objeto. Existem várias formas de se fazer esta checagem. A mais famosa é usar o comando: SP_HELP EMPRESA, ou então usar outra consulta: SELECT * FROM SYSOBJECTS WHERE NAME = 'EMPRESA'. Neste caso, obrigatoriamente, vc deve estar logado na base ARARAQUARA.

    Diante disso temos duas situações:

    1) Se existir a tabela, o problema pode ser de collation da base. (Informe qual o collation utilizado...). Pois o collation pode estar configurado para considerar apenas letras maiusculas ou vice-versa. Daí se vc fizer uma consulta com letras minusculas dará o erro q vc informa, por exemplo.

    2) Se não existir a tabela. Problema resolvido! Realmente dará erro pois o objeto não existe nesta base.

    Desculpe se exagerei nas explicações....Mas pelo erro as duas opções anteriores são as mais provaveis. Lembrando que estamos considerando o q foi explicado no inicio, as bases estando em uma mesma istância.

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    domingo, 7 de novembro de 2010 03:07
  • Bom entaum pelo o que eu entendi...

    Todos os meus bancos estao na mesma instancia e os objetos realmente existe...

    e se por exemplo...

    string

     

    sss = ConfigurationManager.ConnectionStrings["AgudosConnectionString"].ConnectionString;

     

    SqlConnection conn = new SqlConnection(sss);

    conn.Open();

     

    string sss = ConfigurationManager.ConnectionStrings["AvareConnectionString"].ConnectionString;

     

    SqlConnection conn = new SqlConnection(sss);

    conn.Open();

    abri as duas conexões ... e depois tentasse executar...antes de fecha-las.

    SqlCommand

    comm = new SqlCommand("Select * From agudos.dbo.Empresas union all Select * From avare.dbo.Empresas");

     

     

     

    seria uma forma logica de executar esta query?

     

     

    segunda-feira, 8 de novembro de 2010 17:38
  • Jeferson,

    Se vc rodar somente as consultas diretamente no banco, da erro ou não?

     

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    segunda-feira, 8 de novembro de 2010 17:56
  • é ai que ta .. da erro...

    e pelo o que eu vejo fala que eu naum posso acessar o outro banco ou algo assim.

    lembrando que estes bancos estão no servidor...protegidos por senhas...

    porem minhas conecttionstring estao todas configuradas adequadamente.

    se eu fosse executar via codigo eu precisaria abrir todas as conexões mesmo as minhas conexões corretas.?

    segunda-feira, 8 de novembro de 2010 18:01
  • Essas consultas já funcionaram alguma vez? Pois se vc tem permissão total, as bases estão na mesma instância, os objetos existem, não há o pq de dar esse erro.

    Vc verificou sobre o collation das bases e do servidor?

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    segunda-feira, 8 de novembro de 2010 18:25
  • naum funcionaram... sempre que eu tento fazer uma consulta em varios bancos... da esse erro..  apontando para        "agudos.dbo.Empresa" mais detalhes do erro!!

    SELECT c.Cidade, COUNT(*) AS Ranking
    FROM agudos.dbo.relatorios AS m INNER JOIN
    agudos.dbo.Empresa AS c ON c.id = m.id
    GROUP BY c.Cidade
    UNION ALL
    SELECT c.Cidade, COUNT(*) AS Ranking
    FROM avare.dbo.relatorios AS m INNER JOIN
    avare.dbo.Empresa AS c ON c.id = m.id
    GROUP BY c.Cidade
    ORDER BY Ranking DESC

    Msg 916, Level 14, State 1, Line number 1
    The server principal "agudos
    " is not able to access the database "avare" under the current security context.

     

    segunda-feira, 8 de novembro de 2010 19:16
  • Neste caso tá com cara de permissão. Faça um teste conectando como SA e rodando a consulta.

    Dê tb uma olhada neste link: http://sqlmusings.wordpress.com/2008/06/12/issue-server-principal-is-not-able-to-access-the-database-under-the-current-security-context/

    Tem um passo a passo que talvez possa te ajudar.

     

    Tem tb este: http://social.msdn.microsoft.com/forums/en-US/sqlsecurity/thread/03fe3f21-e37d-4c7c-a5c0-ec47afa665f2

     

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    segunda-feira, 8 de novembro de 2010 19:34