在 sql postdeployment 构建脚本中使用变量?
Posted
技术标签:
【中文标题】在 sql postdeployment 构建脚本中使用变量?【英文标题】:Using variable in sql postdeployment build script? 【发布时间】:2014-10-03 11:31:53 【问题描述】:我想做的是能够在 Visual Studio 数据库项目中创建一个发布 xml 脚本,该脚本定义一个变量,用于编写脚本。
我的问题是出现错误:“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 变量”窗口。在 SQLCMD 变量表中定义您的 $(DeployType)
变量。这将允许项目编译,因此您可以(并且实际上需要)从脚本本身中删除行 :setvar DeployType "varchar(100)"
。
【讨论】:
我有一个非常相关的问题,你也可以为我解答***.com/questions/42846424/… 我还发现不加默认值项目会构建失败以上是关于在 sql postdeployment 构建脚本中使用变量?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Visual Studio 数据库项目的 PostDeployment 脚本插入图像