Пример запроса к связанному серверу SQL Server

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

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

В основном, вы просто вводите имя сервера базы данных в db.table?

16 ответов

Решение

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

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

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


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

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

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

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

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

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

SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')

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

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

Пример:

 SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]') 

Если вы все еще находите проблему с <server>.<database>.<schema>.<table>

Включите имя сервера в []

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

select foo.id 
    from databaseserver1.db1.dbo.table1 foo
        inner join databaseserver2.db1.dbo.table1 bar 
            on foo.name = bar.name

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

select * from [Server].[database].[schema].[tablename] 

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

Для проверки связанных серверов звоните:

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

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

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

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

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

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

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

В sql-server (local) есть два способа запросить данные со связанного сервера (удаленного).

Распределенный запрос (четырехчастная нотация):

  1. Может работать не со всеми удаленными серверами. Если ваш удаленный сервер - MySQL, распределенный запрос работать не будет.
  2. Фильтры и объединения могут работать неэффективно. Если у вас есть простой запрос с предложением WHERE, sql-server(local) может сначала получить всю таблицу с удаленного сервера, а затем применить предложение WHERE локально. В случае больших таблиц это очень неэффективно, так как большое количество данных будет перемещено с удаленного на локальный. Тем не менее, это не всегда так. Подробнее
  3. С положительной стороны синтаксис T-SQL будет работать.
      SELECT * FROM [SERVER_NAME].[DATABASE_NAME].[SCHEMA_NAME].[TABLE_NAME] 

ОТКРЫТЫЙ ЗАПРОС

  1. Это в основном сквозной. Запрос полностью обрабатывается на удаленном сервере, поэтому будет использоваться индекс или любая оптимизация на удаленном сервере. Эффективно сокращает объем данных, передаваемых с удаленного на локальный sql-сервер.
  2. Незначительным недостатком этого подхода является то, что синтаксис T-SQL не будет работать, если удаленный сервер не является sql-сервером.
      SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME.SCHEMA_NAME.TABLENAME')

В целом OPENQUERY кажется гораздо лучшим вариантом для использования в большинстве случаев.

Я сделал, чтобы узнать тип данных в таблице на link_server, используя openquery, и результаты были успешными.

SELECT * FROM OPENQUERY (LINKSERVERNAME, '
SELECT DATA_TYPE, COLUMN_NAME
FROM [DATABASENAME].INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME  =''TABLENAME''
')

Это работа для меня

Следующий запрос лучше всего работает.

Попробуйте этот запрос:

SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')

Это очень помогает связать MySQL с MS SQL

Для MariaDB (и, вероятно, MySQL) попытка указать схему с использованием синтаксиса с тремя точками не сработала, что привело к ошибке «недопустимое использование схемы или каталога». Следующее решение сработало:

  1. В SSMS перейдите в Объекты сервера> Связанные серверы> Поставщики> MSDASQL.
  2. Убедитесь, что установлены флажки "Динамический параметр", "Только нулевой уровень" и "Разрешить в процессе".

Затем вы можете запросить любую схему и таблицу, используя следующий синтаксис:

      SELECT TOP 10 *
FROM LinkedServerName...[SchemaName.TableName]

Источник: SELECT * FROM MySQL Linked Server с использованием SQL Server без OpenQuery

Вы пытались добавить "вокруг имени?

как:

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

PostgreSQL:

  1. Вы должны указать имя базы данных в DSN источника данных.
  2. Запустите Management Studio от имени администратора
  3. Вы должны опустить DBName в запросе:

    SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')

Другие вопросы по тегам