Формат, вероятно, должен быть:
<server>.<database>.<schema>.<table>
Например: DatabaseServer1.db1.dbo.table1
Обновление : я знаю, что это старый вопрос, и у меня есть правильный ответ; однако я думаю, что любой, кто наткнется на это, должен знать несколько вещей.
А именно, при запросе к связанному серверу в ситуации соединения ВСЯ таблица со связанного сервера, вероятно, будет загружена на сервер, с которого выполняется запрос, для выполнения операции соединения. В случае OP и table1
from, DB1
и table1
from 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')
Это может вам помочь.
источник
Если вы все еще сталкиваетесь с проблемой
<server>.<database>.<schema>.<table>
Вложите имя сервера в
[]
источник
dbo.databaseserver1.db1.dbo.table1
Для тех, у кого есть проблемы с этими другими ответами , попробуйте
OPENQUERY
Пример:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
источник
Вам необходимо указать схему / владельца (по умолчанию 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]
Это правильный способ звонка. Перед выполнением запроса убедитесь, что серверы связаны!
Чтобы проверить наличие связанных серверов, позвоните:
источник
select name from drsql01.test.dbo.employee
Надеюсь, это поможет понять, как выполнить запрос для связанного сервера
источник
Обычно прямые запросы не следует использовать в случае связанного сервера, потому что он сильно использует временную базу данных SQL-сервера. На первом этапе данные извлекаются во временную БД, после чего происходит фильтрация. Об этом много тредов. Лучше использовать открытый OPENQUERY, потому что он передает SQL на исходный связанный сервер, а затем возвращает отфильтрованные результаты, например
SELECT * FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
источник
Как бы то ни было, я обнаружил, что следующий синтаксис работает лучше всего:
ВЫБРАТЬ * С [LINKED_SERVER] ... [ТАБЛИЦА]
Я не мог заставить работать рекомендации других, используя имя базы данных. Кроме того, у этого источника данных нет схемы.
источник
щелкните правой кнопкой мыши таблицу и щелкните таблицу сценариев как выберите
источник
Лучше всего подходит следующий запрос.
SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')
источник
PostgreSQL :
Вы должны опустить DBName в запросе :
SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')
источник
Я сделал, чтобы узнать тип данных в таблице на link_server, используя openquery, и результаты были успешными.
SELECT * FROM OPENQUERY (LINKSERVERNAME, ' SELECT DATA_TYPE, COLUMN_NAME FROM [DATABASENAME].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =''TABLENAME'' ')
Это работа для меня
источник