Могу ли я использовать полные имена объектов в переменных sqlcmd, применяемых в проекте базы данных Visual Studio? - PullRequest
0 голосов
/ 28 сентября 2018

У нас есть проект базы данных, который объединяет таблицу с другой базой данных.Поскольку другое имя базы данных может измениться, ссылка на другую базу данных указывается с помощью переменной sqlcmd, то есть inner join [$(otherdb)].Table1 ..., для которой мы настроили параметры развертывания.

Теперь я пытаюсь сделать этот проект развертываемым влокальный экземпляр SQL Server для нас как разработчиков, и я хотел бы, чтобы не пришлось развертывать также базу данных, на которую ссылаются, на той же машине.Итак, я условно ($ (IsLocal) = 'true') настраиваю связанный сервер так, чтобы он указывал на наш сервер dev SQL DB, и только для локальных развертываний я пытаюсь настроить переменную $ (otherdb), чтобы она имела значение: linkedserver.otherdb, а не просто otherdb.

Это работает в SQL со связанным сервером и вручную выполняет фактические запросы, но, похоже, не работает для развертываний на основе режима sqlcmd.Оказывается, квадратные скобки выводят по линиям [linkedserver.otherdb].Table1 (а не [linkedserver].[otherdb].Table1), и если я просто уберу квадратные скобки (linkedserver.otherdb.Table1), я получу ошибку во время сборки для проекта Database, говорящую о неверном синтаксисе,Таким образом, квадратные скобки должны быть там, но полностью определенное вложенное имя делает его недействительным.

Я также попытался использовать значение переменной sqlcmd linkedserver].[otherdb, чтобы привести к сгенерированному запросу [связанный сервер]. [otherdb ]. [Table1].Это также работает в SQL, когда я пытаюсь выполнить sqlcmd, но когда Visual Studio генерирует скрипт, он добавляет дополнительные ], что приводит к:

:setvar otherdb "linkedserver]].[otherdb"

Если я удаляю лишние ], это работает, но нет никакого способа вмешаться в этот сгенерированный вывод в сценарии T-SQL без сценария cmd или PowerShell.(Есть?)

Есть ли другой подход, который я могу использовать?

1 Ответ

0 голосов
/ 28 сентября 2018

Я знаю эту проблему, и как бы я ни думал об этом, я не смог найти элегантного решения проблемы.По сути, у вас есть следующие варианты:

  1. Завершите свою среду DEV, развернув пустую (или почти пустую) ссылочную базу данных на том же сервере.Все будет работать, никаких изменений кода не требуется.
  2. Перепишите весь свой соответствующий код, чтобы использовать идентификаторы из 4 частей для указанной базы данных.Среда DEV будет работать нормально;PROD потребует связанного с обратной связью сервера, который указывает на себя, чтобы к объектам в ссылочной базе данных можно было обращаться, используя имена из четырех частей.Это, вероятно, создаст узкое место в производительности, помимо других потенциальных проблем.

Убедитесь сами, какой путь проще или приемлемее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...