Соединение таблиц из разных БД на разных серверах: решение

Быстрый ответ
Чтобы объединить таблицы, которые локализованы на разных серверах, воспользуйтесь функциональностью связанных серверов или методом OPENQUERY. Предлагаю вашему вниманию пример конфигурации связанного сервера для последующего использования в запросе:
-- Начинаем работу
EXEC sp_addlinkedserver @server='RemoteServer'; -- Добавляем связанный сервер
-- Переходим к объединению таблиц
SELECT l.Name, r.SalesAmount
FROM localDB.dbo.Customers l
JOIN RemoteServer.remoteDB.dbo.Sales r
ON l.CustomerID = r.CustomerID; -- И все это окунуто в SQL!
Пожалуйста, убедитесь, что имена серверов, баз данных и таблиц соответствуют вашим рабочим условиям. Для установления постоянной связи предпочтительно использовать связанные серверы, а для выполнения единичных запросов к удаленным серверам пользуйтесь методом OPENQUERY.

Пошаговая процедура
Создание связанных серверов
Сначала добавьте связанный сервер с помощью sp_addlinkedserver
. Это дает возможность обращаться к нему столь же просто, как и к локальному:
-- Кто там?
EXEC sp_addlinkedserver @server='RemoteServer'; -- Ваш новенький связанный сервер!
Уделяйте особое внимание вопросам прав доступа и безопасности при работе со связанными серверами. Здесь вам сможет пригодиться помощь администратора базы данных.

Оптимизация производительности запросов с использованием функции OPENQUERY
Применяйте OPENQUERY
для улучшения производительности запросов. Эта функция позволяет отфильтровать данные до момента их отправки:
-- Сначала мы фильтруем данные на удаленном сервере
SELECT *
FROM OPENQUERY(RemoteServer, 'SELECT SalesID, SalesAmount FROM remoteDB.dbo.Sales WHERE SalesDate > ''20230101''') AS r
JOIN localDB.dbo.Customers l
ON l.CustomerID = r.SalesID; -- До свидания, ненужные передачи данных!
При таком подходе снижается объем сетевого трафика и предотвращается его перегруженность.
Применение временных таблиц
Для упрощения проведения регулярных сложных процедур слияния можно использовать временные таблицы:
-- Создаем временную таблицу
SELECT *
INTO #LocalSalesData
FROM OPENQUERY(RemoteServer, 'SELECT SalesID, SalesAmount FROM remoteDB.dbo.Sales');
-- Основной запрос
SELECT l.Name, s.SalesAmount
FROM localDB.dbo.Customers l
JOIN #LocalSalesData s
ON l.CustomerID = s.SalesID; -- Приятного аппетита!
Стратегии обработки больших объемов данных
При работе с крупными массивами данных рассмотрите возможность использования ETL-процедур или копирования таблиц, особенно если на повестке дня дельта-обновления. Учитывайте величину передаваемых данных и сетевой трафик. Представьте себе сеть как автомагистраль в час пик.
Визуализация
Представьте себе, что запросы между двумя базами данных — это встреча двух космонавтов из разных стран, вооруженных желанием общаться данными в безграничном пространстве:
Космическая станция Альфа (🛰️ A): Хранит базу данных А 📄🗂️
Космическая станция Браво (🛰️ B): Хранит базу данных B 📄🗂️
Связь между ними реализована через Межзвездную Сеть (🔗):
🛰️ A 🔗 🛰️ B
# Надежный канал связи установлен между двумя космическими станциями (серверами)
SQL-запрос действует как специализированный робот, который осуществляет слияние данных:
SELECT *
FROM [ServerA].[DatabaseA].[dbo].[TableA] A
INNER JOIN [ServerB].[DatabaseB].[dbo].[TableB] B
ON A.Key = B.Key -- Работа робота во всей красе!
Профессиональные рекомендации по улучшению запросов
- Четко и конкретно указывайте полные наименования — исключите возможность двусмысленности.
- Регулярно проверяйте синтаксис SQL, чтобы предотвратить ошибки.
- Для выполнения одиночных запросов без создания связанного сервера используйте OPENROWSET.
- Заранее продумайте меры безопасности при конфигурации удаленных подключений.
- Объединяйте только те элементы таблиц, которые действительно необходимы для оптимизации обработки запросов.
Полезные материалы
- Создание связанных серверов – SQL Server | Microsoft Learn — детальное руководство по работе со связанными серверами в SQL Server.
- OPENQUERY (Transact-SQL) – SQL Server | Microsoft Learn — инструкция по применению функции OPENQUERY в контексте работы со связанными серверами.
- sp_addlinkedserver (Transact-SQL) – SQL Server | Microsoft Learn — пошаговое руководство к использованию sp_addlinkedserver для добавления связанных серверов.
- SQL-соединение между базами данных на разных серверах — опыт сообщества Stack Overflow в вопросах SQL-объединения между разными базами данных.
- Клонирование SQL Server Login со всеми разрешениями с помощью PowerShell — руководство по управлению правами доступа в SQL Server в связи с безопасностью при выполнении кросс-базовых запросов.