Почему использование OPENQUERY на локальном сервере плохое?

Я пишу script, который должен запускаться вокруг группы серверов и выбирать из них кучу данных, включая локальный сервер. SQL, необходимый для выбора необходимых мне данных, довольно сложный, поэтому я пишу какое-то специальное объявление и использую инструкцию OPENQUERY для получения данных, поэтому в конечном итоге я заканчиваю так:

exec('INSERT INTO tabl SELECT * FROM OPENQUERY(@Server, @AdHocView)')

Однако, я слышал, что использование OPENQUERY на локальном сервере неодобрительно. Может ли кто-нибудь уточнить, почему?

Ответ 1

  • Хотя запрос может возвращать несколько наборов результатов, OPENQUERY возвращает только первый.
  • OPENQUERY не принимает переменные для своих аргументов.
  • OPENQUERY не может использоваться для выполнения расширенных хранимых процедур на связанном сервере. Однако расширенная хранимая процедура может быть выполнена на связанном сервере с использованием имени из четырех частей.
  • Если хранимая процедура sp_addlinkedserver используется в одном и том же script, учетные данные, используемые на удаленном сервере, жестко закодированы в script, видимые всем, у кого есть копия

Ссылка:

Ответ 2

В дополнение к тому, что сказал @OMG Ponies, это просто лишний. Нет причин вводить специальный запрос и семантику распределенной транзакции, когда вам этого не нужно. Когда вы используете OPENQUERY, вы берете на себя все негативные аспекты динамического SQL, в том числе менее прогнозируемые планы и неспособность сервера точно отслеживать зависимости.

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

Ответ 3

Просто выполните следующие действия.

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

например, если вам нужно сравнивать результаты с двух серверов (сервера тестирования и развертывания) при переходе с SQL Server 2005 на SQL Server 2008, например, тогда вы может выполнить следующий запрос:

select * into test_table from OpenQuery(testServer, 'exec testdb.dbo.test_sp');
select * into rollout_table from OpenQuery(rolloutServer, 'exec testdb.dbo.test_sp');

select * from test_table
except
select * from rollout_table;

select * from rollout_table
except
select * from test_table;

чтобы увидеть какие-либо расхождения.