sql - 使用 SQLCMD 的 PostDeployment.sql 脚本中的条件逻辑

标签 sql database sql-server-2008 sqlcmd

我正在使用 SQL 2008 数据库项目(在 Visual Studio 中)来管理我的项目的架构和初始测试数据。 atabase 项目使用后期部署,其中包括许多使用 SQLCMD 的“:r”语法的其他脚本。

我希望能够根据 SQLCMD 变量有条件地包含某些文件。这将允许我通过夜间构建多次运行该项目,以设置具有不同数据配置的各种版本的数据库(对于 Multi-Tenancy 系统)。

我尝试了以下方法:

IF ('$(ConfigSetting)' = 'Configuration1')
  BEGIN
    print 'inserting specific configuration' 
:r .\Configuration1\Data.sql
  END
ELSE
  BEGIN
    print 'inserting generic data' 
:r .\GenericConfiguration\Data.sql
  END

但是我得到一个编译错误: SQL01260:发生致命解析器错误:Script.PostDeployment.sql

有没有人看到这个错误或设法以这种方式配置他们的部署后脚本以使其灵活?还是我完全以错误的方式解决了这个问题?

谢谢, 罗布

附言我也试过改变它,使文件的路径是一个变量,similar to this post .但这给了我一个错误,说路径不正确。

最佳答案

更新

我现在发现上面的 if/else 语法对我不起作用,因为我的一些链接脚本需要 GO 语句。基本上 :r 只是内联导入脚本,所以这变成了无效的语法。

如果您需要链接脚本中的 GO 语句(就像我一样),那么没有任何简单的方法可以解决这个问题,我最终创建了几个部署后脚本,然后更改我的项目以覆盖主要的部署后脚本构建时间取决于构建配置。这现在正在做我需要的,但似乎应该有更简单的方法!

对于任何需要同样东西的人 - I found this post useful

所以在我的项目中我有以下部署后文件:

  • Script.PostDeployment.sql(将被替换的空文件)
  • Default.Script.PostDeployment.sql(链接到标准数据配置所需的脚本)
  • Configuration1.Script.PostDeployment.sql(链接到特定数据配置所需的脚本)

然后我将以下内容添加到项目文件的末尾(右键单击卸载然后右键单击编辑):

  <Target Name="BeforeBuild">
      <Message Text="Copy files task running for configuration: $(Configuration)" Importance="high" />
      <Copy Condition=" '$(Configuration)' == 'Release' " SourceFiles="Scripts\Post-Deployment\Default.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" />
      <Copy Condition=" '$(Configuration)' == 'Debug' " SourceFiles="Scripts\Post-Deployment\Default.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" />
      <Copy Condition=" '$(Configuration)' == 'Configuration1' " SourceFiles="Scripts\Post-Deployment\Configuration1.Script.PostDeployment.sql" DestinationFiles="Scripts\Post-Deployment\Script.PostDeployment.sql" OverwriteReadOnlyFiles="true" />
  </Target>

最后,您需要在解决方案中设置匹配的构建配置。

此外,对于任何尝试其他解决方法的人,我也尝试了以下但没有任何运气:

  1. 创建后期构建事件来复制文件,而不必破解项目文件 XML。我无法让它工作,因为我无法形成部署后脚本文件的正确路径。 This connect issue describes the problem

  2. 使用脚本路径变量传递给 :r 命令。但是我用这种方法遇到了几个错误。

关于sql - 使用 SQLCMD 的 PostDeployment.sql 脚本中的条件逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7151021/

相关文章:

sql-server-2008 - SQL Server 2008 中的全文邻近和最大距离语法

SQL。如何映射两列频率?

php - 该 SQL 查询中的错误在哪里?

php - Laravel 单个 Controller 与多个 Controller 以及数据库行与列

SQL 和 DB2 创建命令

sql-server-2008 - 如何在插入时获取下一个ID?

sql - 不允许新事务,因为 session 中还有其他线程正在运行。 SQL Server 中的错误

sql - 按顺序排列 MySQL 结果?

java sql + 检查真/假

python - Django 测试 : Got an error creating the test database: database "database_name" already exists