sql - 仅在满足条件时执行许多脚本,而不通过 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的最佳方法是什么?(部署后,附加项目,...?)
解决方案
让您IF
检查一小批,然后设置PARSEONLY
为ON
.
每个后续批次都不会被执行,直到它遇到另一个SET PARSEONLY
语句(是的,文档实际上并没有提到SET
语句不受“不编译和执行”的影响PARSEONLY
)