Выбор данных с двух разных серверов в SQL Server - PullRequest
327 голосов
/ 17 июля 2009

Как выбрать данные в одном запросе из двух разных баз данных, которые находятся на двух разных серверах в SQL Server?

Ответы [ 15 ]

323 голосов
/ 17 июля 2009

То, что вы ищете, это связанные серверы. Вы можете получить их в SSMS из следующего местоположения в дереве Обозревателя объектов:

Server Objects-->Linked Servers

или вы можете использовать sp_addlinkedserver .

Вы должны настроить только один. После этого вы можете вызвать таблицу на другом сервере следующим образом:

select
    *
from
    LocalTable,
    [OtherServerName].[OtherDB].[dbo].[OtherTable]

Обратите внимание, что владелец не всегда dbo, поэтому обязательно замените его любой схемой, которую вы используете.

86 голосов
/ 12 марта 2014

Вы можете сделать это, используя связанный сервер.

Обычно связанные серверы настроены так, чтобы компонент Database Engine мог выполнять инструкцию Transact-SQL, включающую таблицы в другом экземпляре SQL Server или другом продукте базы данных, например Oracle. Многие типы источников данных OLE DB могут быть настроены как связанные серверы, включая Microsoft Access и Excel.

Связанные серверы предлагают следующие преимущества:

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

Подробнее о Связанные серверы .

Чтобы создать связанный сервер, выполните следующие действия:

  1. Объекты сервера -> Связанные серверы -> Новый связанный сервер

  2. Укажите имя удаленного сервера.

  3. Выберите тип удаленного сервера (SQL Server или другой).

  4. Выберите Безопасность -> Выполнить, используя этот контекст безопасности, и введите логин и пароль удаленного сервера.

  5. Нажмите OK, и все готово !!

Здесь - это простое руководство по созданию связанного сервера.

ИЛИ

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

Синтаксис:

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ] 
     [ , [ @provider= ] 'provider_name' ]
     [ , [ @datasrc= ] 'data_source' ] 
     [ , [ @location= ] 'location' ] 
     [ , [ @provstr= ] 'provider_string' ] 
     [ , [ @catalog= ] 'catalog' ] 

Подробнее о sp_addlinkedserver .

Вы должны создать связанный сервер только один раз . После создания связанного сервера мы можем запросить его следующим образом:

select * from LinkedServerName.DatabaseName.OwnerName.TableName
24 голосов
/ 17 июля 2009
SELECT
        *
FROM
        [SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]

Вы также можете посмотреть на использование связанных серверов. Связанные серверы могут быть и другими типами источников данных, такими как платформы DB2. Это один из способов доступа к DB2 с помощью вызова SQL Server TSQL или Sproc ...

22 голосов
/ 06 августа 2009

Запросы к двум различным базам данных - это распределенный запрос. Вот список некоторых техник плюс плюсы и минусы:

  1. Связанные серверы: Предоставляют доступ к более широкому спектру источников данных, чем обеспечивает репликация SQL Server
  2. Связанные серверы: Соединение с источниками данных, которые репликация не поддерживает или которые требуют специального доступа
  3. Связанные серверы: Работать лучше, чем OPENDATASOURCE или OPENROWSET
  4. OPENDATASOURCE и OPENROWSET функции: Удобно для извлечения данных из источников данных на разовой основе. OPENROWSET также имеет функции BULK, которые могут / не могут требовать формат файла, который может быть fiddley
  5. OPENQUERY : не поддерживает переменные
  6. Все являются решениями T-SQL. Относительно прост в реализации и настройке
  7. Все зависят от связи между источником и назначением, что может повлиять на производительность и масштабируемость
15 голосов
/ 28 июля 2016

Это все хорошие ответы, но этот отсутствует, и он имеет свои собственные мощные применения. Возможно, это не соответствует тому, что хотел ОП, но вопрос был расплывчатым, и я чувствую, что другие могут найти свой путь здесь. Как правило, вы можете использовать 1 окно для одновременного выполнения запроса к нескольким серверам, вот как:

В SSMS откройте Зарегистрированные серверы и создайте Новая группа серверов в Локальные группы серверов .

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

Теперь вернитесь к группе, которую вы создали на первом шаге, щелкните правой кнопкой мыши и выберите New Query. Откроется новое окно запроса, и любой выполняемый вами запрос будет выполнен на каждом сервере в группе. Результаты представлены в одном наборе данных с дополнительным именем столбца, указывающим, с какого сервера поступила запись. Если вы используете строку состояния, вы заметите, что имя сервера заменено на множественный .

14 голосов
/ 14 декабря 2013

попробуйте это:

SELECT * FROM OPENROWSET('SQLNCLI', 'Server=YOUR SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
UNION
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=ANOTHER SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
6 голосов
/ 03 мая 2018

У меня была такая же проблема при подключении SQL_server 2008 к SQL_server 2016, размещенному на удаленном сервере. Другие ответы не сработали для меня прямо. Я пишу здесь свое подстроенное решение, так как думаю, что оно может пригодиться кому-то еще.

Расширенный ответ для удаленных подключений к базе данных IP:

Шаг 1: связать серверы

EXEC sp_addlinkedserver @server='SRV_NAME',
   @srvproduct=N'',
   @provider=N'SQLNCLI',   
   @datasrc=N'aaa.bbb.ccc.ddd';

EXEC sp_addlinkedsrvlogin 'SRV_NAME', 'false', NULL, 'your_remote_db_login_user', 'your_remote_db_login_password'

... где SRV_NAME - выдуманное имя. Мы будем использовать его для обращения к удаленному серверу из наших запросов. aaa.bbb.ccc.ddd - это IP-адрес удаленного сервера, на котором размещена БД SQLserver.

Шаг 2: Выполните ваши запросы Например:

SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table

... и все тут!

Сведения о синтаксисе: sp_addlinkedserver и sp_addlinkedsrvlogin

4 голосов
/ 20 августа 2015

Server 2008:

Когда в SSMS подключен к серверу 1.DB1 и попробуйте:

SELECT  * FROM
[server2].[DB2].[dbo].[table1]

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

Я получаю ошибку:

Не удалось найти сервер DB2 в sys.servers. Убедитесь, что правильно имя сервера было указано. При необходимости выполните хранимую процедуру sp_addlinkedserver для добавления сервера в sys.servers.

Чтобы добавить сервер:

ссылка: Добавить сервер с помощью sp_addlinkedserver Ссылка: [1]: Чтобы добавить сервер с помощью sp_addlinkedserver

Чтобы увидеть, что находится в ваших sys.servers, просто запросите его:

SELECT * FROM [sys].[servers]
4 голосов
/ 17 июля 2009

Создано определение связанного сервера на одном сервере с другим (для этого вам нужен SA), а затем просто присвойте им четырехзначное именование (см. BOL).

2 голосов
/ 16 мая 2016
 select * 
 from [ServerName(IP)].[DatabaseName].[dbo].[TableName]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...