Итак, используя SSDT в Visual Studio 2013, я могу указать имя базы данных ...

create view vSample1 as 
select * from [$(RandomDatabase)].dbo.TableName

Я также могу сделать это с помощью имени из четырех частей

create view vSample2 as 
select * from [$(RandomServer)].[$(RandomDatabase)].dbo.TableName

Но когда я пытаюсь сделать это с помощью TableName, я получаю ошибки ...

create view vSample3
select * from [$(RandomServer)].[$(RandomDatabase)].dbo.[$(RandomTable)]

Это дает мне ошибку, похожую на

Error:  SQL71561: View: [vSample3] has an unresolved reference to object [$(RandomServer)].[$(RandomDatabase)].dbo.[$(RandomTable)].

Я просмотрел окно переменных SQLCMD в настройках проекта и убедился, что переменная $ (RandomTable) определена как TableName, но все равно выдает ошибки сборки.

Почему это так и как это исправить?

Благодарность

1
Jason 9 Апр 2015 в 23:29
Из интереса, зачем вам случайное имя таблицы? Вы пытались вместо этого использовать синонимы?
 – 
Ed Elliott
10 Апр 2015 в 00:26
1
У одного из наших поставщиков есть продукт, который мы развернули в четырех различных средах. Этот продукт имеет недетерминированно сгенерированную схему ... в одной среде таблица может называться [KeyType124], а в другой среде - [KeyType133]. Я надеялся упростить запросы к базе данных в каждой среде, используя SSDT для создания одного набора запросов, который я мог бы развернуть в этой среде в форме представлений. Тогда все, что вам нужно запомнить, это vNames или vAddresses вместо KeyType133.
 – 
Jason
10 Апр 2015 в 02:57

2 ответа

Лучший ответ

Я бы использовал сценарий до / после развертывания, чтобы создать такое представление с помощью sp_executesql и динамического запроса.

exec sp_executesql N'create view vSample3 as
select * from [$(RandomServer)].[$(RandomDatabase)].dbo.[$(RandomTable)]'
1
scar80 10 Апр 2015 в 21:52
Тогда SSDT увидит эту строку как строку вместо оператора sql: тогда он не будет выполнять проверку или рефакторинг для нее.
 – 
Jason
11 Апр 2015 в 03:19
Просто попробуйте, он будет работать, хотя не будет проверен. Боюсь, вы не можете использовать переменные в скриптах, которые компилируются / собираются.
 – 
scar80
11 Апр 2015 в 21:44

Я бы использовал синонимы - создаю таблицу, которая соответствует фактической таблице, и создаю синоним, указывающий на это, затем ссылаюсь на синоним в представлении или просто на ссылку вместо представления. Вам это нужно, чтобы вы могли скомпилировать и получить полезные вещи, такие как ссылки и т. Д.

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

(Тогда выкиньте своего продавца в b & DD $ за такую ​​надоедливую систему)

1
Ed Elliott 10 Апр 2015 в 10:20
Разве это не та же проблема? Следующий оператор по-прежнему вызывает аналогичную ошибку о неразрешенном [$ (RandomTable)]: CREATE SYNONYM Sample3 FOR [$ (RandomServer)]. [$ (RandomDatabase)]. Dbo. [$ (RandomTable)] Для ясности, я хочу, чтобы это решение было интегрировано с SSDT, и я также не могу изменять базу данных поставщика (она находится в лицензионном соглашении), поэтому каким-то образом мне нужно иметь возможность использовать переменную для развертывания представления / синонима / чего угодно.
 – 
Jason
10 Апр 2015 в 14:19
Да, поэтому в ssdt создайте синоним и поддельную таблицу, которая имеет то же определение, что и настоящая таблица - затем при развертывании измените синоним, чтобы он указывал на фактическую таблицу (которая отличается в каждой базе данных). Если у вас нет таблицы в SSDT, она не сможет определить определение и т. Д. (Например, столбцы) - вам не нужно развертывать поддельную таблицу
 – 
Ed Elliott
10 Апр 2015 в 17:05
Я ценю ваш совет, но в этот момент кажется, что вы наносите макияж слону. Я не хочу обойти эту проблему, создавая дополнительные объекты в моих базах данных (объекты, которые, похоже, мне понадобятся только в моей среде разработки) ... Я хочу, чтобы переменная работала. Если это единственный выбор, который у меня есть, это одно, но я бы предпочел просто получить ответ о том, что мне нужно сделать, чтобы SSDT распознал таблицу на основе переменной SQLCMD, как и в случае с базой данных. и сервер.
 – 
Jason
10 Апр 2015 в 21:32
Для чего вы используете ssdt? Я спрашиваю, потому что одно из основных преимуществ - проверка правильности вашего кода при компиляции - если вы используете переменную, указывающую на несуществующую таблицу, она не может проверить ее правильность. У вас также есть довольно уникальная среда, поэтому она не будет прямой!
 – 
Ed Elliott
11 Апр 2015 в 00:05
В моей среде разработки у меня была бы переменная, указывающая на KeyItem123, где это правильно. Когда я развертываю dacpac в среде qa, я бы развернул его, используя sqlpackage / variables: RandomTable = KeyItem324 (или что-то еще). Да, проверка и рефакторинг - это лишь некоторые из причин, по которым я хочу использовать SSDT.
 – 
Jason
11 Апр 2015 в 03:15