Почему плохо использовать OPENQUERY на локальном сервере? - PullRequest
6 голосов
/ 03 марта 2010

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

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

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

Ответы [ 3 ]

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

Ссылка:

2 голосов
/ 11 июня 2013

Просто продолжение.

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;

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

2 голосов
/ 03 марта 2010

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

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

...