Как я могу выбрать данные в одном запросе из двух разных баз данных, которые находятся на двух разных серверах в 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