Пример запроса к связанному серверу SQL Server - PullRequest
83 голосов
/ 04 ноября 2010

Находясь в Management Studio, я пытаюсь выполнить запрос / выполнить объединение двух связанных серверов.Это правильный синтаксис с использованием связанных серверов БД:

select foo.id 
from databaseserver1.db1.table1 foo, 
     databaseserver2.db1.table1 bar 
where foo.name=bar.name

Как правило, вы просто вводите имя сервера БД в таблицу db.table?

Ответы [ 11 ]

167 голосов
/ 04 ноября 2010

Формат, вероятно, должен быть:

<server>.<database>.<schema>.<table>

Например: DatabaseServer1.db1.dbo.table1


Обновление : я знаю, что этостарый вопрос и ответ у меня правильный;тем не менее, я думаю, что любой, кто сталкивается с этим, должен знать несколько вещей.

А именно, при запросе к связанному серверу в ситуации соединения таблица ENTIRE со связанного сервера будет вероятно будет загружено на сервер, с которого выполняется запрос, для выполнения операции соединения.В случае OP оба table1 из DB1 и table1 из DB2 будут полностью переданы на сервер, выполняющий запрос, предположительно с именем DB3.

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

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

Если это невозможно, вам нужно взглянуть на различные вещи, которые заставляют SQL-сервер загружать всю таблицу локально.Например, используя GETDATE() или даже определенные соединения.Другие убийцы производительности включают не предоставление соответствующих прав.

См. http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ для получения дополнительной информации.

25 голосов
/ 16 марта 2016
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')

Это может вам помочь.

9 голосов
/ 13 августа 2013

Если проблема с <server>.<database>.<schema>.<table>

все еще не устранена

8 голосов
/ 07 февраля 2017

Для тех, у кого проблемы с этими другими ответами , попробуйте OPENQUERY

Пример:

 SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]') 
8 голосов
/ 04 ноября 2010

Вам необходимо указать схему / владельца (dbo по умолчанию) как часть ссылки. Кроме того, было бы предпочтительнее использовать более новый стиль соединения (ANSI-92).

select foo.id 
    from databaseserver1.db1.dbo.table1 foo
        inner join databaseserver2.db1.dbo.table1 bar 
            on foo.name = bar.name
5 голосов
/ 10 декабря 2015
select * from [Server].[database].[schema].[tablename] 

Это правильный способ звонка.Обязательно убедитесь, что серверы связаны, прежде чем выполнять запрос!

Чтобы проверить наличие связанных серверов, позвоните:

EXEC sys.sp_linkedservers 
3 голосов
/ 15 января 2018
select name from drsql01.test.dbo.employee
  • drslq01 - это servernmae - связанный серер
  • тест - это имя базы данных
  • dbo - это схема-схема по умолчанию
  • сотрудник - имя таблицы

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

2 голосов
/ 25 июня 2018

щелкните правой кнопкой мыши таблицу и выберите таблицу сценариев, выбрав

enter image description here

2 голосов
/ 24 октября 2017

Для чего бы это ни стоило, я нашел следующий синтаксис для лучшей работы:

SELECT * FROM [LINKED_SERVER] ... [TABLE]

Я не смог получить рекомендациидругие для работы, используя имя базы данных.Кроме того, этот источник данных не имеет схемы.

2 голосов
/ 02 марта 2016

Обычно прямые запросы не должны использоваться в случае связанного сервера, потому что он интенсивно использует временную базу данных SQL-сервера.На первом этапе данные извлекаются во временную базу данных, а затем происходит фильтрация.Об этом много тем.Лучше использовать open OPENQUERY, потому что он передает SQL на исходный связанный сервер, а затем возвращает отфильтрованные результаты, например

SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
...