在 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 构建脚本中使用变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在heroku上查看postdeploy脚本的输出?

使用 Visual Studio 数据库项目的 PostDeployment 脚本插入图像

ElasticBeanstalk Ruby PostDeploy 脚本任务不可能

部署后脚本中 :r 引用的脚本显示错误

什么定义了 VS2012 数据库项目中脚本执行的顺序?

数据库项目 SQLCMD -v