Как я могу ссылаться на таблицы из нескольких баз данных на одном сервере в общем табличном выражении (CTE)? - PullRequest
0 голосов
/ 02 ноября 2018

У меня SQL Server 2014 Express с несколькими базами данных. Одна из них имеет общие таблицы с информацией, общей для остальных баз данных (назовем эту базу данных UniversalData).

В других базах данных есть информация, относящаяся к конкретному сайту (назовем одну из этих баз данных Site01Data). Универсальные данные могут измениться, и я не хочу регулярно их реплицировать в другие специфичные для сайта базы данных, поэтому я хочу включить таблицу UniversalData в некоторые запросы, некоторые из которых включают CTE.

Что я пытаюсь сделать:

WITH CTE1 AS
(
     SELECT * 
     FROM UniversalData.dbo.someTable
),
CTE2 AS 
(
     SELECT * 
     FROM Site01Data.dbo.anotherTable
), 
CTE3 AS
(
     SELECT CTE1.field1, CTE2.field2 
     FROM CTE1 
     JOIN CTE2 ON CTE1.idx = CTE2.idx
)
SELECT * 
FROM CTE3;

Это не генерирует ошибку, но я, похоже, не получаю данных от CTE1 в моем последнем запросе (нулевой набор результатов). Интуитивно понятно, означает ли это, что он сохраняет временную таблицу в базе данных UniversalData, которая недоступна из базы данных Site01Data?

Как я могу использовать CTE с таблицами из разных баз данных на одном сервере?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Укажите имя_сервера.site1data.dbo.table и т. Д. И, если необходимо, используйте связанные серверы для разных имен серверов

0 голосов
/ 02 ноября 2018

Есть много способов сделать это ..

Вы можете прочитать таблицы в одной базе данных во временную таблицу во второй базе данных, а затем присоединиться к ней .. или объединить их обе на лету.

но сначала .. воздержитесь от выбора * * укажите столбцы

Вы могли бы пойти

select t1.column1,t2.column2

from UniversalData.dbo.someTable t1

inner join Site01Data.dbo.anotherTable t2
 on t2.ida = t2.idx

и т. Д. .. это зависит от того, каким образом вы хотите указать соединение и какой тип соединения вы хотите выбрать.

Предполагается, что обе базы данных находятся в одном и том же экземпляре ... иначе вам понадобятся связанные серверы

...