Как включить OpenQuery в проект SSDT (без ошибок SQL71501 / «неразрешенная ссылка на объект»)

У меня есть проект Visual Studio SSDT, в котором одно представление ссылается на связанный сервер через именование 4 частей. Я создал проект для базы данных на связанном сервере и создал ссылку из основного проекта на проект «связанный сервер», и все работает нормально.

Мне было поручено использовать OpenQuery вместо соглашения об именах из 4 частей, потому что на самом деле OpenQuery выполняется в 2-3 раза быстрее, чем запрос с использованием соглашения об именах из 4 частей.

Однако, когда я изменяю представление в SSDT для использования открытого запроса, я получаю сообщение об ошибке: Код серьезности Описание Ошибка состояния подавления строки файла проекта SQL71501: представление: [схема]. [Представление] имеет неразрешенную ссылку на объект [LINKEDSERVER].

Я попытался определить [LINKEDSERVER] в скрипте проекта:

exec master.dbo.sp_addlinkedserver @server = N'LINKEDSERVER', @srvproduct=N'SQLSERVER', @provider=N'SQLNCLI', @datasrc=N'SERVERNAME'

А также попытался добавить то же самое в указанный проект.

Итак, как включить OpenQuery в проект SSDT, не вызывая ошибок SQL71501 / «неразрешенная ссылка на объект»?

Ошибка OpenQuery, тогда как 4 части работают нормально


person ubienewbie    schedule 01.03.2018    source источник
comment
Вероятно, вам нужно настроить ссылку на базу данных (вероятно, с dacpac для внешней БД - или, по крайней мере, на объекты, которые вам нужны во внешней БД). Добавьте это как ссылку на базу данных в разделе Ссылки для другой базы данных, другого сервера и соответствующим образом установите переменные среды. Это должно позволить вам ссылаться на объект (ы) связанного сервера.   -  person Peter Schott    schedule 01.03.2018
comment
как упоминалось в вопросе, я уже создал ссылки (типа другой базы данных, другого сервера) на проект целевой базы данных, и все работает нормально, когда я использую четырехчастное именование. Но он перестает работать, когда я использую OpenQuery ([LINKEDSERVER), '...   -  person ubienewbie    schedule 02.03.2018
comment
Понятно - у вас должна быть возможность ссылаться на него с помощью переменных $ (LinkedServer). $ (Database). Хотя это и не идеально, всегда есть возможность использовать какой-то сценарий после развертывания для создания вашего proc / view. Вам не нужно пытаться добавить связанный сервер к самому проекту. Справочник БД позаботится об этом.   -  person Peter Schott    schedule 06.03.2018
comment
Спасибо, Питер, я добавил снимок экрана, который, надеюсь, очень ясно иллюстрирует проблему: 4-х частное соглашение об именах (с использованием [$ (LinkedServer)]. [$ (Database)]. Schema.table) работает очень хорошо. Но OpenQuery ([$ (LinkedServer)], 'select * from table') не работает. Можно ли использовать OpenQuery в проекте SSDT без ошибок? Интересно, возможно ли это?   -  person ubienewbie    schedule 07.03.2018
comment
Это определенно могло быть так. Признаюсь, я не пытался включать операторы OpenQuery в свои проекты SSDT. Я использовал запросы связанного сервера один или два раза, но всегда с именами из 4 частей.   -  person Peter Schott    schedule 04.04.2018


Ответы (1)


Я уже давно борюсь с этой проблемой. Я решил:

  • Импорт master.dacpac, который включает необходимые связанные серверы.
  • Создание ссылки на базу данных из вызывающей базы данных в DACPAC базы данных, на которую я ссылаюсь (убедитесь, что установлен флажок «Подавить предупреждение о ссылке»).
  • использовал синтаксис OpenQuery([LINKEDSERVER], ‘xxx’);, а не OpenQuery([$([LINKEDSERVER])], ‘xxx’);

    Надеюсь, это поможет!

person Poweredbytones    schedule 30.09.2019
comment
Большое спасибо за это, я попробую (хотя я ушел от той ситуации, в которой возникла проблема ...). На глаз действительно есть опечатка (открывающие / закрывающие скобки не совпадают). Не могли бы вы дважды проверить / исправить в интересах будущих пользователей? Спасибо! - person ubienewbie; 02.10.2019