我希望能够做的是能够在Visual Studio数据库项目中创建一个定义变量的publising xml脚本,该脚本将用于编写脚本。 / p>
我的问题是我收到错误:“SQL72008:未定义变量DeployType。”如果我不在后部署脚本中定义变量,就像这样“:setvar DeployType”varchar(100)“
当我运行publish.xml时,DeployType参数正确地设置在生成的脚本 BUT 的顶部,该值被“:setvar DeployType”varchar(100)覆盖。所以要做这个工作我需要在运行这个脚本之前手动删除该行。
所以问题是我如何让项目构建并能够在postdeployment脚本中默认发布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语句,因为它已被默认。
希望这很清楚。
答案 0 :(得分:13)
我知道这是一个有点旧的帖子,但这里是答案:
单击数据库项目上的属性并导航到&#34; SQLCMD变量&#34;窗口。在SQLCMD变量表中定义$(DeployType)
变量。这将允许项目进行编译,因此您可以(并且实际需要)从脚本本身中删除行:setvar DeployType "varchar(100)"
。