Selezionare Query su 2 tabelle, su server di database diversi
-
08-06-2019 - |
Domanda
Sto cercando di generare un report interrogando 2 database (Sybase) in ASP classico.
Ho creato 2 stringhe di connessione:
connA per databaseA
connB per databaseB
Entrambi i database sono presenti sullo stesso server (non so se questo è importante)
Interrogazioni:
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
seguito da:
response.Write(rstsql) <br>
set rstSQL = CreateObject("ADODB.Recordset")<br>
rstSQL.Open q1, connA<br>
rstSQL.Open q2, connB
Quando provo ad aprire questa pagina in un browser, ricevo il messaggio di errore:
Errore '80040e37' del provider Microsoft OLE DB per i driver ODBC
[DataDirect][Driver ODBC Sybase Wire Protocol][SQL Server]#temp non trovato.Specificareowner.objectname o utilizzare sp_help per verificare se l'oggetto esiste (sp_help può produrre molti output).
Qualcuno potrebbe aiutarmi a capire qual'è il problema e aiutarmi a risolverlo?
Grazie.
Soluzione
Con entrambe le query, sembra che tu stia tentando di inserire in #temp.#temp si trova su uno dei database (per amor di argomento, databaseA).Pertanto, quando provi a inserire #temp dal databaseB, segnala che non esiste.
Prova a cambiarlo da In #temp Da A In databaseA.dbo.#temp Da in entrambe le dichiarazioni.
Inoltre, assicurati che le stringhe di connessione abbiano i permessi sull'altro DB, altrimenti non funzionerà.
Aggiornamento:relativo alla tabella temporanea che esce dall'ambito: se si dispone di una stringa di connessione che dispone di autorizzazioni su entrambi i database, è possibile utilizzarla per entrambe le query (mantenendo attiva la connessione).Quando esegui una query sulla tabella nell'altro DB, assicurati di utilizzare il formato [NomeDB].[Proprietario].[NomeTabella] quando fai riferimento alla tabella.
Altri suggerimenti
La tua tabella temporanea è fuori portata, è solo "viva" durante la prima connessione e non sarà disponibile nella seconda connessione, basta spostarla tutto in un blocco di codice ed eseguilo all'interno di una connezione
la temperatura non rientra nell'ambito di q2.
Tutto il tuo lavoro può essere svolto in una sola query:
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