为何SQL Server脚本中死代码里的QUIT语句仍会执行?
为什么sqlcmd执行含QUIT的SQL脚本时,无论条件如何都会终止?
问题出在QUIT的本质——它是sqlcmd工具的专属命令,不属于T-SQL语法范畴。sqlcmd执行脚本时,会先全局扫描所有sqlcmd命令(比如QUIT、GO、:SETVAR这类),并优先执行它们,完全不会等待T-SQL的条件判断逻辑。哪怕你把QUIT放在T-SQL的IF分支里,sqlcmd一读到这个命令就直接退出,根本不会走到T-SQL的分支判断环节。
解决方法
方法1:用T-SQL语句终止脚本
如果要在T-SQL的条件逻辑里终止执行,使用T-SQL原生的错误抛出语句,比如THROW(适用于SQL Server 2012及以上版本):
DECLARE @Flag BIT; SET @Flag = 1; -- 切换这个值测试 IF @Flag = 0 BEGIN PRINT 'OFF'; THROW 50000, 'Flag为0,终止脚本执行', 1; -- 抛出自定义错误终止T-SQL流程 END ELSE BEGIN PRINT 'ON'; END;
执行时加上-b参数,让sqlcmd在T-SQL出错时自动退出:
sqlcmd -i test.sql -b
方法2:用sqlcmd自身的条件逻辑
如果一定要使用QUIT命令,需要改用sqlcmd级别的变量和条件判断(注意是:IF而非T-SQL的IF):
:SETVAR Flag 1 -- sqlcmd级别的变量,不是T-SQL变量 :IF $(Flag) = 0 BEGIN PRINT 'OFF' QUIT END ELSE BEGIN PRINT 'ON' END
这种方式下,sqlcmd会先处理自身的条件逻辑,只有满足条件时才执行QUIT。
内容的提问来源于stack exchange,提问作者dokaspar
相关产品推荐
相关产品推荐

