Выбор данных с двух разных серверов в SQL Server

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

Ответ 1

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

Server Objects-->Linked Servers

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

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

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

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

Ответ 2

Вы можете сделать это с помощью Linked Server.

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

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

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

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

Для создания связанного сервера выполните следующие действия:

  • Объекты сервера → Связанные серверы → Новый связанный сервер

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

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

  • Выберите "Безопасность" → Создайте этот контекст безопасности и укажите логин и пароль удаленного сервера.

  • Нажмите "ОК", и все готово!

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

ИЛИ

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

Синтаксис:

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

Ответ 3

SELECT
        *
FROM
        [SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]

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

Ответ 4

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

  • Связанные серверы: Предоставление доступа к более широкому спектру источников данных, чем репликация SQL Server, обеспечивает
  • Связанные серверы:. Соединитесь с источниками данных, которые не поддерживают репликацию или которые требуют доступа ad hoc.
  • Связанные серверы: Выполнять лучше, чем OPENDATASOURCE или OPENROWSET
  • OPENDATASOURCE и Функции OPENROWSET: Удобно для получения данных из источников данных на разовой основе. OPENROWSET также имеет BULK-объекты, которые могут/не могут потребовать файл формата, который может быть fiddley
  • OPENQUERY: не поддерживает переменные
  • Все - это решения T-SQL. Относительно легко реализовать и настроить
  • Все зависят от соединения между источником и удалением, что может повлиять на производительность и масштабируемость.

Ответ 5

попробуйте следующее:

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

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

В SSMS откройте Зарегистрированные серверы и создайте новую группу серверов в разделе Группы локальных серверов.

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

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

Ответ 7

У меня была такая же проблема, чтобы подключить 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

Ответ 8

Сервер 2008:

Когда в SSMS подключен к server1.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]

Ответ 9

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

Ответ 10

 select * 
 from [ServerName(IP)].[DatabaseName].[dbo].[TableName]

Ответ 11

sp_addlinkedserver('servername')

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

select * from table1
unionall
select * from [server1].[database].[dbo].[table1]

Ответ 12

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

В связанном сервере введите имя сервера или IP-адрес для другого сервера и выберите SQL Server В разделе Безопасность выберите (сделайте это с помощью этого контекста безопасности) Записать логин и пароль для другого сервера

Теперь подключитесь, используйте

Select * from [server name or ip addresses ].databasename.dbo.tblname

Ответ 13

Я знаю, что это старый вопрос, но я использую синонимы. Предположительно запрос выполняется в сервере базы данных A и ищет таблицу на сервере базы данных B, которая не существует на сервере A. Затем добавьте синоним в базу данных A, которая вызывает вашу таблицу с сервера B. В вашем запросе не требуется включая любые схемы или разные имена баз данных, просто вызовите имя таблицы в обычном режиме, и оно будет работать.

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

Ответ 14

Упрощенное решение для добавления связанных серверов

Первый сервер

EXEC sp_addlinkedserver @server='ip,port\instancename'

Второй вход

EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'

Выполнять запросы из связанных с локальными БД

INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]

Ответ 15

Как @Super9 рассказал об OPENDATASOURCE с использованием аутентификации SQL Server с поставщиком данных SQLOLEDB. Я просто публикую здесь фрагмент кода для одной таблицы в текущей базе данных сервера, где выполняется код, а другой на другом сервере '192.166.41.123'

SELECT top 2 * from dbo.tblHamdoonSoft  tbl1 inner JOIN  
OpenDataSource('SQLOLEDB','Data Source=192.166.41.123;User ID=sa;Password=hamdoonsoft')
.[TestDatabase].[dbo].[tblHamdoonSoft1] tbl2 on tbl1.id = tbl2.id