Inquiridor
uma Consulta em diversos bancos....Sql

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 pedroBanco matao
id nome
1 manuelBanco sao carlos
id nome
1 tiagopreciso 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 pedroaparentemente é 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!!
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.EmpresasAtenderia?
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. -
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 DESCum 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 3ou 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 DESCe 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..
-
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. -
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?
- Editado Jeferson Medeiros segunda-feira, 8 de novembro de 2010 18:02
-
-
é 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.?
-
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. -
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. -
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.