Пример запроса к связанному серверу 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) есть два способа запросить данные со связанного сервера (удаленного).
Распределенный запрос (четырехчастная нотация):
- Может работать не со всеми удаленными серверами. Если ваш удаленный сервер - MySQL, распределенный запрос работать не будет.
- Фильтры и объединения могут работать неэффективно. Если у вас есть простой запрос с предложением WHERE, sql-server(local) может сначала получить всю таблицу с удаленного сервера, а затем применить предложение WHERE локально. В случае больших таблиц это очень неэффективно, так как большое количество данных будет перемещено с удаленного на локальный. Тем не менее, это не всегда так. Подробнее
- С положительной стороны синтаксис T-SQL будет работать.
SELECT * FROM [SERVER_NAME].[DATABASE_NAME].[SCHEMA_NAME].[TABLE_NAME]
ОТКРЫТЫЙ ЗАПРОС
- Это в основном сквозной. Запрос полностью обрабатывается на удаленном сервере, поэтому будет использоваться индекс или любая оптимизация на удаленном сервере. Эффективно сокращает объем данных, передаваемых с удаленного на локальный sql-сервер.
- Незначительным недостатком этого подхода является то, что синтаксис 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) попытка указать схему с использованием синтаксиса с тремя точками не сработала, что привело к ошибке «недопустимое использование схемы или каталога». Следующее решение сработало:
- В SSMS перейдите в Объекты сервера> Связанные серверы> Поставщики> MSDASQL.
- Убедитесь, что установлены флажки "Динамический параметр", "Только нулевой уровень" и "Разрешить в процессе".
Затем вы можете запросить любую схему и таблицу, используя следующий синтаксис:
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:
- Вы должны указать имя базы данных в DSN источника данных.
- Запустите Management Studio от имени администратора
Вы должны опустить DBName в запросе:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')