Использование переменной в сценарии сборки после развертывания 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)"
из самого сценария.