【问题标题】:SQLCMD include all scripts in folderSQLCMD 包括文件夹中的所有脚本
【发布时间】:2014-03-13 14:29:17
【问题描述】:

在我的部署后脚本中,我想使用通配符将所有脚本文件包含在一个文件夹中,如下所示: :r .\$(ReleaseName)\*.sql

有没有办法做到这一点?没找到。。

【问题讨论】:

  • 很确定你不能那样做。 $(ReleaseName) 部分将起作用,但我认为您需要按名称显式调用每个脚本。此外,如果其中一个脚本需要按特定顺序运行,这可能会很危险。
  • 您可以尝试编写一个预构建操作来生成您的部署后脚本的内容吗?例如,它可以调用一个批处理脚本,该脚本遍历目录中的每个 sql 文件并为它们生成一个 :r 语句。请参阅stackoverflow.com/questions/19596892/… 以获取提及这一点的答案。不过,这需要您进行一些工作/调查。
  • 谢谢你们。脚本可以按任何顺序运行。我会看一下链接,虽然它听起来有点太复杂了..

标签: sqlcmd sql-server-data-tools


【解决方案1】:

我搞定了:

<MyFilesPath Include="$(ProjectDir)MyPath\*.sql"/>
<MyFiles Include="@(MyFilesPath->':r %22..\Scripts\%(filename)%(extension)%22%0D%0A', '')"/>

然后我在我的 PostScript 文件中包含 @MyFiles。

【讨论】:

  • 你把那个放在哪里了?
  • 实际上在一个包含的配置文件中(在一个目标标签中),但我想你可以把它放在主要的。
  • 能否请您发布配置文件 xml 的外观以及您的 PostScript(相关位),因为我似乎无法让它工作。
  • 我的回答中描述了我们如何包含:stackoverflow.com/questions/27923573/…
【解决方案2】:

我采用了一种更容易理解的不同方法。

我只是将代码添加到数据库项目属性页面中的 Pre-build 事件,将脚本文件复制到单个文件中。我调用bat 文件并将项目路径作为参数传递,因为编辑文件比尝试在属性页面的那个小文本框中进行编辑要好得多。

$(ProjectDir)PreBuildEvent.bat "$(ProjectDir)"

我将bat 的内容设置为:

copy %ProjectDir%DbUpdateScripts\*-Pre.sql %ProjectDir%DbUpdateScripts\AllPreScripts.sql
copy %ProjectDir%DbUpdateScripts\*-Post.sql %ProjectDir%DbUpdateScripts\AllPostScripts.sql

然后将这些文件包含在您的实际部署前和部署后脚本中。

:r .\DbUpdateScripts\AllPreScripts.sql
:r .\DbUpdateScripts\AllPostScripts.sql

最后,将AllPreScripts.sqlAllPostScripts.sql 添加到您的.gitignore 文件中,如果您有一个文件可以防止它们被添加到源代码管理中。

【讨论】:

  • 这是最好的解决方案。很容易理解。为了使它工作,我必须在批处理文件中将%ProjectDir% 替换为%@ProjectDir%,并在文件开头添加行SET @ProjectDir=%1%;。此外,将 AllPostScripts.sql 添加到文件 .gitignore。
  • 注意:sql文件需要用ANSI编码,否则你会因为OEM字符在组合文件中出现语法错误......我已经描述了这个问题here。我已经为此浪费了一个下午,所以我希望这条评论可以为您省去麻烦。
  • 另外,使用命令type 而不是copy 会更好,因为它会自动在脚本之间添加回车符。这使结果脚本具有更好的可读性,并且还让您想到不要将脚本的最后一个单词与下一个脚本的第一个世界合并。
猜你喜欢
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
相关资源
最近更新 更多