如何有条件地在 ssdt 部署后脚本中包含大型脚本?

ada*_*101 5 sql sql-server sql-server-2014 sql-server-data-tools

在我们的 SSDT 项目中,我们有一个巨大的脚本,其中包含许多用于从旧系统导入数据的 INSERT 语句。使用 sqlcmd 变量,我希望能够有条件地将文件包含到部署后脚本中。

我们目前使用的:r语法包括内联脚本:

IF '$(ImportData)' = 'true'
BEGIN
  :r .\Import\OldSystem.sql
END
Run Code Online (Sandbox Code Playgroud)

这是一个问题,因为 无论是真还是假,脚本都被内联包含$(ImportData),而且文件太大,导致构建速度减慢了大约 15 分钟。

是否有另一种方法有条件地包含此脚本文件,以免减慢构建速度?

bie*_*ski 6

而不是将我先前的答案与另一个答案混淆。有一个非常简单的选项的特殊情况。

为每个执行可能性创建单独的 SQLCMD 输入文件。这里的关键是使用控制变量的值命名执行输入文件。

因此,例如,您的发布脚本定义了变量“Config”,该变量可能具有以下值之一:“Dev”、“QA”或“Prod”。

创建 3 个名为“DevPostDeploy.sql”、“QAPostDeploy.sql”和“ProdPostDeploy.sql”的部署后脚本。

像这样编码你的实际部署后文件:

:r ."\"$(Config)PostDeploy.sql

这非常类似于构建事件机制,您可以用适当的脚本覆盖脚本,除非您不需要构建事件。但是您依赖于非常具体地命名您的脚本。


ada*_*101 0

我最终混合使用了我们的构建工具 (Jenkins) 和 SSDT 来完成此任务。这就是我所做的:

  1. 向每个特定于环境的 Jenkins 作业添加了一个写入文本文件的构建步骤。我要么编写包含导入文件的 SQLCMD 命令,要么根据用户选择的构建参数将其保留为空。
  2. 通过 . 在部署后脚本中包含新的文本文件:r。

就是这样!我还使用相同的方法根据应用程序版本选择要包含在项目中的部署前和部署后脚本,只不过我从代码中获取版本号并使用 VS 中的预构建事件将其写入文件构建工具中的。(我还添加了文本文件名,.gitignore这样它就不会被提交)