SQL Server 2019中Data、value含义及批处理除零报错问题求解
SQL Server 2019批处理问题解答
1. Data与value的属性说明
Data和value都不是SQL Server 2019的内置保留关键字,二者是你定义的公用表达式(CTE)的自定义名称和自定义列别名:WITH后紧跟的Data是本次临时结果集的命名,括号内的value是你为CTE返回的列指定的别名,完全属于自定义命名,和系统内置功能无关。
2. 批处理的预期运行逻辑
这段代码的设计思路如下:
- 首先定义临时结果集CTE
Data,包含两行数据,列value的取值分别为0和1 - 后续查询对CTE的结果做聚合判断:
- 先判断所有行的
value最小值是否小于等于0,满足则返回0 - 若上一个条件不满足,再判断所有行的
1/value计算结果的最大值是否大于等于100,满足则返回1
- 先判断所有行的
3. 除以零报错的根因
报错的核心原因是SQL Server的执行顺序优先级:聚合函数的计算早于CASE分支判断。
你可能认为当第一个WHEN条件MIN(value) <= 0成立时,第二个WHEN的MAX(1/value)就不会执行,但实际上MAX(1/value)属于聚合计算,会在CASE分支判断之前,先对CTE内的所有行提前完成计算:当计算到value=0的行时,1/0触发除零错误,此时还没有进入CASE分支的判断逻辑,因此直接报错。
4. 修复写法
可以在计算1/value前先加非0判断,规避除零场景:
WITH Data (value) AS ( SELECT 0 UNION ALL SELECT 1 ) SELECT CASE WHEN MIN(value) <= 0 THEN 0 WHEN MAX(CASE WHEN value <> 0 THEN 1/value END) >= 100 THEN 1 END FROM Data ;
内容的提问来源于stack exchange,提问作者Vikram Singh
相关产品推荐
相关产品推荐

