首页 > 解决方案 > 仅在满足条件时执行许多脚本,而不通过 GO 语句中断 IF

问题描述

在我的 SSDT 项目(Visual Studio 数据库项目)中,我有很多脚本,只有在满足条件时才必须执行。
条件是服务器名称 ( @@servername != 'LiveServer')。
脚本将执行各种操作,例如创建表/存储过程/作业、从其他地方获取数据等。
由于要执行的操作很多,因此这些脚本中有很多GO-statements。


问题:
由于有很多GO-statements,我如何让条件工作?当这样做时,我猜GO那些里面的语句PostDeployMasterScripts会破坏IF-语句?

IF (@@SERVERNAME != 'LiveServer')
print CONVERT(varchar, sysdatetime(), 8) + ' executing linked scripts'
:r .\PostDeployMasterScripts\Linked\CreateTemporaryTables.sql
:r .\PostDeployMasterScripts\Linked\CreateProcedures.sql
:r .\PostDeployMasterScripts\Linked\FetchInitialData.sql
:r .\PostDeployMasterScripts\Linked\CreateJobs.sql
print CONVERT(varchar, sysdatetime(), 8) + ' linked postdeploy finished'
GO

我正在考虑在我的解决方案中将所有这些 postdeploy-scripts 移动到一个单独的项目中,但我不确定这是否能解决问题,即使当我找到一种仅在给定条件下执行脚本的方法时也是如此。


所需的解决方案:(tl;dr)
实现给定条件并执行我的脚本而不破坏IF-statement的最佳方法是什么?(部署后,附加项目,...?)

标签: sqlsql-server-data-toolssqlcmddatabase-project

解决方案


让您IF检查一小批,然后设置PARSEONLYON.

每个后续批次都不会被执行,直到它遇到另一个SET PARSEONLY语句(是的,文档实际上并没有提到SET语句不受“不编译和执行”的影响PARSEONLY


推荐阅读