我们的 SQL Server 2019 数据库有一个 Visual Studio 解决方案,它存储在一个 git 存储库中。一个表有几个使用 BETWEEN 运算符的检查约束,如下所示。
CONSTRAINT chk_FileTbl_MonthlyDate CHECK (MonthlyDate BETWEEN 1 AND 31)
当我使用 Redgate SQL Compare 14 将 repo 与数据库进行比较时,它显示了使用小于和大于运算符重新格式化的约束,如下所示。
CONSTRAINT chk_FileTbl_MonthlyDate CHECK (MonthlyDate >= 1 AND MonthlyDate <= 31)
我认为这是 Redgate 软件中的错误/功能,并提交了我正在等待回复的票证。但是,我的同事随后使用了 Visual Studio 2019 中的比较工具,它做了同样的事情。如果我们查看定义表的文件,它使用 BETWEEN,但两个比较工具都显示并部署了一个具有小于/大于格式的更改脚本。
是什么导致了这种行为?我们最近搬到了 SQL Server 2019,它是某种内置优化吗?
如果您编写查询并生成执行计划,您会看到它也转换
BETWEEN
为一对>=
和<=
谓词。这些意思是一样的。Redgate 只是向您显示创建约束时 SQL Server存储的内容,而不是您键入的内容。它与 SQL Server 2019 无关。也就是说,我更喜欢两个谓词模式,并在此处和此处
BETWEEN
讨论为什么对日期范围不利。我的意见是避免异常,特别是当它只是方便的速记/语法糖时,尤其是当它与 SQL Server 内部存储它的方式相矛盾时。换句话说,如果您不喜欢该脚本产生与您的代码不同的结果,请更改您的代码并接受.>= AND <=