Selecione Consulta em 2 tabelas, em servidores de banco de dados diferentes
-
08-06-2019 - |
Pergunta
Estou tentando gerar um relatório consultando 2 bancos de dados (Sybase) em ASP clássico.
Eu criei 2 strings de conexão:
connA para banco de dadosA
connB para banco de dadosB
Ambos os bancos de dados estão presentes no mesmo servidor (não sei se isso importa)
Consultas:
q1 = SELECT column1 INTO #temp FROM databaseA..table1 WHERE xyz="A"
q2 = SELECT columnA,columnB,...,columnZ FROM table2 a #temp b WHERE b.column1=a.columnB
seguido pela:
response.Write(rstsql) <br>
set rstSQL = CreateObject("ADODB.Recordset")<br>
rstSQL.Open q1, connA<br>
rstSQL.Open q2, connB
Quando tento abrir esta página em um navegador, recebo uma mensagem de erro:
Erro do provedor Microsoft OLE DB para drivers ODBC '80040e37'
[DataDirect][Driver ODBC Sybase Wire Protocol][SQL Server]#temp não encontrado.Especifique proprietário.objectname ou use sp_help para verificar se o objeto existe (sp_help pode produzir muitos resultados).
Alguém poderia me ajudar a entender qual é o problema e me ajudar a corrigi-lo?
Obrigado.
Solução
Com ambas as consultas, parece que você está tentando inserir em #temp.#temp está localizado em um dos bancos de dados (para fins de argumentos, banco de dadosA).Então quando você tenta inserir no #temp do banco de dadosB, ele informa que ele não existe.
Tente mudar de Em #temp De para Em banco de dadosA.dbo.#temp De em ambas as afirmações.
Além disso, certifique-se de que as cadeias de conexão tenham permissões no outro banco de dados, caso contrário, isso não funcionará.
Atualizar:relacionado à tabela temporária saindo do escopo - se você tiver uma cadeia de conexão que tenha permissões em ambos os bancos de dados, poderá usá-la para ambas as consultas (enquanto mantém a conexão ativa).Ao consultar a tabela no outro banco de dados, certifique-se de usar o formato [DBName].[Owner].[TableName] ao se referir à tabela.
Outras dicas
Sua tabela de temperatura está fora de escopo, é apenas 'viva' durante a primeira conexão e não estará disponível na 2ª conexão, basta mover tudo em um bloco de código e executá -lo dentro de uma conexão
temp está fora do escopo no segundo trimestre.
Todo o seu trabalho pode ser feito em uma consulta:
SELECT a.columnA, a.columnB,..., a.columnZ
FROM table2 a
INNER JOIN (SELECT databaseA..table1.column1
FROM databaseA..table1
WHERE databaseA..table1.xyz = 'A') b
ON a.columnB = b.column1