Пример запроса сервера SQL Server
В Management Studio я пытаюсь запустить запрос/выполнить соединение между двумя связанными серверами.
Является ли это правильным синтаксисом с использованием связанных серверов db:
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
В принципе, вы просто предисловие имени сервера db к db.table?
Ответы
Ответ 1
Формат должен быть:
<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/.
Ответ 2
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
Это может вам помочь.
Ответ 3
Если вы все еще находите проблему с <server>.<database>.<schema>.<table>
Включите имя сервера в []
Ответ 4
Вам нужно указать схему/владельца (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
Для тех, у кого проблемы с этими другими ответами, попробуйте OPENQUERY
Пример:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
Ответ 6
select * from [Server].[database].[schema].[tablename]
Это правильный способ вызова.
Обязательно убедитесь, что серверы связаны перед выполнением запроса!
Чтобы проверить, связаны ли связанные серверы:
EXEC sys.sp_linkedservers
Ответ 7
Обычно прямые запросы не должны использоваться в случае связанного сервера, поскольку он сильно использует временную базу данных SQL-сервера. На первом этапе данные извлекаются во временную БД, затем происходит фильтрация. Об этом очень много. Лучше использовать открытый OPENQUERY, потому что он передает SQL на исходный связанный сервер, а затем возвращает результаты фильтрации, например.
SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
Ответ 8
select name from drsql01.test.dbo.employee
- drslq01 - это сервер --linked
- test - это имя базы данных
- dbo is schema -default схема
- сотрудник имя таблицы
Я надеюсь, что это помогает понять, как выполнить запрос для связанного сервера
Ответ 9
Следующий запрос лучше всего работает.
Попробуйте этот запрос:
SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')
Это очень помогает связать MySQL с MS SQL
Ответ 10
Для чего это стоит, я нашел следующий синтаксис для работы наилучшим образом:
SELECT * FROM [LINKED_SERVER]... [TABLE]
Я не мог заставить рекомендации других работать, используя имя базы данных. Кроме того, этот источник данных не имеет схемы.
Ответ 11
щелкните правой кнопкой мыши по таблице и выберите таблицу сценариев, как выбрать
![enter image description here]()