Выберите запрос на 2 таблицы на разных серверах базы данных

Я пытаюсь создать отчет, запрашивая 2 базы данных (Sybase) в классическом ASP.

Я создал 2 строки подключения:

connA для базы данных
connB для базы данныхB

Обе базы данных находятся на одном сервере (не знаю, имеет ли это значение)

Запросы:

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

с последующим:

response.Write(rstsql) <br>
set rstSQL = CreateObject("ADODB.Recordset")<br>
rstSQL.Open q1, connA<br>
rstSQL.Open q2, connB

Когда я пытаюсь открыть эту страницу в браузере, я получаю сообщение об ошибке:

Ошибка поставщика Microsoft OLE DB для драйверов ODBC '80040e37'

[DataDirect] [Драйвер протокола ODBC Sybase Wire] [SQL Server] #temp не найден. Укажите owner.objectname или используйте процедуру sp_help, чтобы проверить, существует ли объект (процедура sp_help может выдавать много результатов).

Может ли кто-нибудь помочь мне понять, в чем проблема, и помочь мне ее исправить?

Спасибо.

Ответов (3)

Решение

В обоих запросах похоже, что вы пытаетесь вставить в #temp. #temp находится в одной из баз данных (для аргументов databaseA). Поэтому, когда вы пытаетесь вставить в #temp из базы данныхB, он сообщает, что его не существует.

Попробуйте изменить его с Into #temp From на Into databaseA.dbo. # Temp From в обоих операторах.

Кроме того, убедитесь, что строки подключения имеют разрешения для другой БД, иначе это не сработает.

Обновление: относится к временной таблице, выходящей за рамки - если у вас есть одна строка подключения, которая имеет разрешения для обеих баз данных, вы можете использовать это для обоих запросов (при сохранении соединения). При запросе таблицы в другой БД обязательно используйте формат [DBName]. [Owner]. [TableName] при обращении к таблице.

temp выходит за рамки в q2.

Вся ваша работа может быть выполнена одним запросом:


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

ваша временная таблица выходит за рамки, она «жива» только во время первого соединения и не будет доступна во втором соединении. Просто переместите все это в один блок кода и выполните его внутри одного соединения.