SQL Server 2022中CHECK约束与筛选索引为何转换NULL判断语法?
关于SSDT部署时IS [NOT] NULL转换为IS [NOT] DISTINCT FROM NULL的问题解答
1. 转换后与原谓词的等效性
在针对NULL值的判断场景里,IS NULL 和 IS NOT DISTINCT FROM NULL 完全等效;IS NOT NULL 和 IS DISTINCT FROM NULL 也完全等效。IS NOT DISTINCT FROM本身就是NULL安全的相等判断逻辑,当右侧是NULL时,效果和IS NULL没有任何区别,所有场景下都能得到一致的结果。
2. 仅在CHECK约束和筛选索引中转换的原因
- SSDT的部署逻辑针对Azure SQL和兼容级别160的SQL Server 2022做了适配,CHECK约束、筛选索引这类对象的谓词属于静态元数据定义,SSDT可以安全地做语法转换
- Azure SQL的最佳实践里推荐用
IS [NOT] DISTINCT FROM这类NULL安全语法来明确表达NULL判断逻辑,SSDT会对齐这个规范 - 普通查询语句的语法转换可能会带来不必要的变更,所以SSDT只针对这两类对象的定义做处理
3. 转换的优势
- 语法统一:让NULL判断逻辑和普通值的NULL安全判断(比如
a IS NOT DISTINCT FROM b)保持语法风格一致,避免混合使用不同的NULL判断写法 - 语义直观:对于不熟悉SQL三值逻辑的开发者,
IS NOT DISTINCT FROM NULL比IS NULL更直白地表达“该值等于NULL”的语义 - 跨平台兼容:转换后的定义可以在Azure SQL和SQL Server 2022之间无缝迁移,不需要额外修改语法
4. 兼容性风险
- 在兼容级别160的SQL Server 2022和Azure SQL环境里,完全兼容,不会有任何问题
- 如果后续需要将数据库降级到160以下的兼容级别,这些转换后的谓词会触发语法错误——因为低版本SQL Server不支持
IS [NOT] DISTINCT FROM语法。遇到这种情况,需要提前备份原对象定义,降级时手动改回IS [NOT] NULL写法
内容的提问来源于stack exchange,提问作者Dai
相关产品推荐
相关产品推荐

