Использование переменной в сценарии сборки после развертывания SQL?

Я хотел бы иметь возможность создавать публикуемый xml-скрипт в проекте базы данных Visual Studio, который определяет переменную, которая будет использоваться для создания скрипта.

Моя проблема в том, что я получаю сообщение об ошибке: "SQL72008: переменная DeployType не определена". если я не определяю переменную в сценарии после развертывания, например: ":setvar DeployType "varchar(100)"

Когда я запускаю publish.xml, параметр DeployType правильно устанавливается в верхней части сгенерированного скрипта, НО это значение переопределяется с помощью ":setvar DeployType "varchar(100)". Поэтому, чтобы эта работа работала, мне нужно вручную удалить этот строка перед запуском этого скрипта.

Итак, вопрос в том, как я могу позволить проекту построить и быть в состоянии публиковать без значения по умолчанию переменной setvar в сценарии пост-развертывания?

Это содержимое моего файла PostDeployment.sql, которое не создается без значения по умолчанию переменной DeployType.

--The line causing my problems. I would like to skip it somehow.
:setvar DeployType "varchar(100)"

Print 'Always include core'
:r ..\Data\Core\_BaseCore.sql

--Conditionaly add based on DeployType comming from the publishing.xml
IF ('$(DeployType)' = 'A')
BEGIN
:r ..\Data\A\_BaseKnap.sql
END
ELSE IF ('$(DeployType)' = 'B')
BEGIN
:r ..\Data\B\_BaseB.sql
END

Это содержимое в файле Database.publish.xml

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <PropertyGroup>
   <IncludeCompositeObjects>True</IncludeCompositeObjects>
   <TargetDatabaseName>db name</TargetDatabaseName>
   <DeployScriptFileName>Database.sql</DeployScriptFileName>
   <ProfileVersionNumber>1</ProfileVersionNumber>
   <TargetConnectionString>Connection string</TargetConnectionString>
 </PropertyGroup>
 <ItemGroup>
   <SqlCmdVariable Include="DeployType">
     <Value>B</Value>
   </SqlCmdVariable>
 </ItemGroup>
</Project>

Когда я публикую это в файле сценария, это будет сгенерированный сценарий, который будет запущен с базой данных, которую я получаю (многие вещи удаляются не нужно).

:setvar DeployType "B"

--This nulls out the DeployType set before
:setvar DeployType "varchar(100)"

Print 'Always include core'
:r ..\Data\Core\_BaseCore.sql

--Conditionaly add based on DeployType comming from the publishing.xml
IF ('$(DeployType)' = 'A')
BEGIN
:r ..\Data\A\_BaseKnap.sql
END
ELSE IF ('$(DeployType)' = 'B')
BEGIN
:r ..\Data\B\_BaseB.sql
END

И при запуске этого (например, в Sql Manager) результат

Print 'Always include core'

где это не входит в заявления IF, потому что это было по умолчанию.

Надеюсь, это достаточно ясно.

1 ответ

Решение

Я знаю, что это немного старая тема, но вот ответ:

Нажмите на свойства вашего проекта базы данных и перейдите в окно "Переменные SQLCMD". Определите свой $(DeployType) переменная в таблице переменных SQLCMD. Это позволит скомпилировать проект и, следовательно, вы можете (и фактически должны) удалить строку :setvar DeployType "varchar(100)" из самого сценария.

Другие вопросы по тегам