我有一个与我的旧问题非常相似的问题Using variable in sql postdeployment build script? 但是现在我不想做if / else并且在我发布的脚本中有sql代码。我不想在客户之间分享信息。
所以...这里去了
我知道我可以
然后在Script.PostDeployment.sql
中使用它:r ..\$(Customer)Setup.sql
我有2个文件
然后我将SQLCMD变量设置为$(Customer)“Customer1”或“Customer2”,并且只包括我放入SQLCMD的那个。
但是当我想在发布窗口中使用该变量时,默认值会覆盖
我知道我可以在构建脚本中执行此操作,但我想知道是否可以使用当前工具并只创建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
答案 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