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


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

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

в принципе, вы просто вводите имя сервера БД в БД.стол ?

11 69

11 ответов:

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

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

например: DatabaseServer1.db1.ДБО.таблица1


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

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

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

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

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

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

SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..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

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

пример:

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

это правильный способ вызова. Убедитесь, что серверы связаны перед выполнением запроса!

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

EXEC sys.sp_linkedservers 

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

SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
select name from drsql01.test.dbo.employee
  • drslq01 is servernmae -- linked serer

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

попробуйте выполнить этот запрос:

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

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

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

ВЫБЕРИТЕ * ИЗ [LINKED_SERVER]...[Таблица]

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

щелкните правой кнопкой мыши на таблице и выберите script table как select

enter image description here