发布时如何不包含sql文件内容?

时间:2017-03-16 23:10:53

标签: sql msbuild sqlcmd database-project dacpac

我有一个与我的旧问题非常相似的问题Using variable in sql postdeployment build script? 但是现在我不想做if / else并且在我发布的脚本中有sql代码。我不想在客户之间分享信息。

所以...这里去了

  • 我在Visual Studio中有一个数据库项目。
  • 我也有2位有不同需求的客户

我知道我可以

  • 使用post.deployment脚本通过在Project.Properties中设置varible来包含我需要的sql文件的内容。“SQLCMD变量”。

enter image description here

然后在Script.PostDeployment.sql

中使用它
:r ..\$(Customer)Setup.sql

我有2个文件

  • Customer1Setup.sql
  • Customer2Setup.sql

然后我将SQLCMD变量设置为$(Customer)“Customer1”或“Customer2”,并且只包括我放入SQLCMD的那个。

但是当我想在发布窗口中使用该变量时,默认值会覆盖

enter image description here

我知道我可以在构建脚本中执行此操作,但我想知道是否可以使用当前工具并只创建Customer1.publish.xml和Customer2.publish.xml文件,以便我知道某些内容是如果发布到Customer2,Customer1不会使用该脚本。

编辑1

我创建了一个公开GitHub repository来尝试解决我的问题。希望有人可以看一看并编辑它。

编辑2

这是我的测试项目的结果(与我的真实测试项目相同),其中我在那里的3个测试中的每一个测试都会产生相同的结果。 Customer2 / Customer3中的所有“内容”都包含在结果中。如果这应该工作,我的设置(VS2015数据库项目)中缺少一些开关或设置

SET NOEXEC ON
Print 'This print statement should not be in the publishing script if     Customer variable is not customer1'
print 'Customer1 stuff from Customer1.sql'
SET NOEXEC OFF

IF('$(Customer)' <> 'customer2')
SET NOEXEC ON
Print 'This print statement should not be in the publishing script if     Customer variable is not customer2'
print 'Customer2 stuff from Customer2.sql'
SET NOEXEC OFF

IF('$(Customer)' <> 'customer3')
SET NOEXEC ON
Print 'This print statement should not be in the publishing script if    Customer variable is not customer3'
print 'Customer3 stuff from Customer3.sql'
SET NOEXEC OFF

编辑3

所以,如果我把它想象得更好一点 这是我想要得到的 enter image description here

但这是我得到的 enter image description here

1 个答案:

答案 0 :(得分:0)

以下不符合预期的工作:

:r ..\$(Customer)Setup.sql

相反,您可以使用IF ELSE方法:

IF ('$(Customer)'='customer1')
BEGIN
    :r .\script_customer1.sql
END
IF ('$(Customer)'='customer2')
BEGIN
    :r .\script_customer2.sql
END

经过一番研究后,我找到了similar SO question。事实证明,如果您在脚本中使用GO,上述操作将无效。所以可以使用以下内容:

IF ('$(Customer)'<>'customer1')
    SET NOEXEC ON

:r .\script_customer1.sql
SET NOEXEC OFF

IF ('$(Customer)'<>'customer2')
    SET NOEXEC ON

:r .\script_customer2.sql
SET NOEXEC OFF