Как выбрать данные в одном запросе из двух разных баз данных, которые находятся на двух разных серверах в SQL Server?
Как выбрать данные в одном запросе из двух разных баз данных, которые находятся на двух разных серверах в SQL Server?
Ответы:
То, что вы ищете, это связанные серверы. Вы можете получить к ним в SSMS из следующего места в дереве обозревателя объектов:
Server Objects-->Linked Servers
или вы можете использовать sp_addlinkedserver .
Вам нужно только настроить один. После этого вы можете вызвать таблицу на другом сервере следующим образом:
select
*
from
LocalTable,
[OtherServerName].[OtherDB].[dbo].[OtherTable]
Обратите внимание, что владелец не всегда dbo
, поэтому не забудьте заменить его на любую схему, которую вы используете.
[OtherServerName].[OtherDB]..[OtherTable]
, лучше включить его, если он известен.
Вы можете сделать это с помощью Linked Server.
Обычно связанные серверы настраиваются так, чтобы компонент Database Engine мог выполнять инструкцию Transact-SQL, которая включает таблицы в другом экземпляре SQL Server или другом продукте базы данных, таком как Oracle. Многие типы источников данных OLE DB могут быть настроены как связанные серверы, включая Microsoft Access и Excel.
Связанные серверы предлагают следующие преимущества:
Узнайте больше о связанных серверах .
Объекты сервера -> Связанные серверы -> Новый связанный сервер
Укажите имя удаленного сервера.
Выберите тип удаленного сервера (SQL Server или другой).
Выберите Security -> Be made с помощью этого контекста безопасности и введите логин и пароль удаленного сервера.
Нажмите ОК, и все готово!
Вот простое руководство по созданию связанного сервера.
ИЛИ
Вы можете добавить связанный сервер, используя запрос.
Синтаксис:
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
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
Вы также можете посмотреть на использование связанных серверов. Связанные серверы могут быть и другими типами источников данных, такими как платформы DB2. Это один из способов получить доступ к DB2 из вызова SQL Server TSQL или Sproc ...
Could not find server '88.208.229.164' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.
Запрос к 2 различным базам данных - это распределенный запрос. Вот список некоторых методов плюс за и против:
попробуй это:
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
Это все хорошие ответы, но этот отсутствует, и он имеет свои собственные мощные применения. Возможно, это не соответствует тому, что хотел ОП, но вопрос был расплывчатым, и я чувствую, что другие могут найти свой путь здесь. Как правило, вы можете использовать 1 окно для одновременного выполнения запроса к нескольким серверам, вот как:
В SSMS откройте Зарегистрированные серверы и создайте новую группу серверов в разделе Группы локальных серверов .
В этой группе создайте регистрацию нового сервера для каждого сервера, который вы хотите запросить. Если имена БД отличаются, убедитесь, что для каждого из них задано значение по умолчанию.
Теперь вернитесь к группе, которую вы создали на первом шаге, щелкните правой кнопкой мыши и выберите New Query. Откроется новое окно запроса, и любой выполняемый вами запрос будет выполнен на каждом сервере в группе. Результаты представлены в одном наборе данных с дополнительным именем столбца, указывающим, с какого сервера поступила запись. Если вы используете строку состояния, вы заметите, что имя сервера заменено на несколько .
У меня была такая же проблема, чтобы подключить 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
Создайте определение связанного сервера на одном сервере с другим (для этого вам нужен SA), а затем просто присвойте им 4-элементное именование (см. BOL).
Server 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]
Как @ 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
Я знаю, что это старый вопрос, но я использую синонимы. Предположительно, запрос выполняется на сервере базы данных A и ищет таблицу на сервере базы данных B, которая не существует на сервере A. Добавьте затем синоним в базу данных A, которая вызывает вашу таблицу с сервера B. Ваш запрос не должен включите любые схемы или разные имена баз данных, просто вызовите имя таблицы, как обычно, и это будет работать.
Нет необходимости связывать серверы, так как синонимы, скажем, являются своего рода связью.
Объекты сервера ---> связанный сервер ---> новый связанный сервер
На связанном сервере введите имя или IP-адрес сервера для другого сервера и выберите SQL Server. В разделе «Безопасность» выберите (сделать это в контексте безопасности). Введите логин и пароль для другого сервера.
Теперь подключен, затем используйте
Select * from [server name or ip addresses ].databasename.dbo.tblname
Упрощенное решение для добавления связанных серверов
Первый сервер
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]