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

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

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

connA для базы
данныхA 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 Protocol] [SQL Server] # элемент не найден. Укажите owner.objectname или используйте sp_help, чтобы проверить, существует ли объект (sp_help может выдавать много выходных данных).

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

Спасибо.

19.08.2008 15:53:19
3 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

4
19.08.2008 16:28:32

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

4
19.08.2008 15:58:06

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
2
19.08.2008 16:03:52