考虑这个表定义:
CREATE TABLE [dbo].[Post]
(
[Id] INT IDENTITY(1,1) NOT NULL,
[PostType] VARCHAR(10) NOT NULL,
CONSTRAINT [CK_Post_PostType] CHECK ([PostType] IN ('Question', 'Answer', 'Comment'))
)
如果我运行它然后查看sys.check_constraints
:
select [definition]
from sys.check_constraints
where [name] = 'CK_Post_PostType';
这是输出:
([PostType]='Comment' OR [PostType]='Answer' OR [PostType]='Question')
所以它将我的“in”语句改为一系列“or”语句。
同样的事情是真实的(至少)
BETWEEN
(更改为OR
语句)和CAST
(变为CONVERT
)。
我意识到这不是 SQL Server 中的功能问题,因为这些表达式在逻辑上是等效的。但这会导致 SSDT 等模式比较工具出现问题,因为源代码与部署的代码不同步。我在这里更详细地介绍了这个问题:SSDT 问题:一遍又一遍地部署相同的更改
这个转换过程/行为有名称吗?是否有关于可能发生的不同转换的任何文档,以便我们可以为它们做好计划(或尽量避免它们)?
从广义上讲,这称为标准化或规范化。
这方面的例子包括(对于表达式)Conjunctive Normal Form和Disjunctive Normal Form。
据我所知,没有任何 Microsoft 文档列出了所涉及的多个进程的所有步骤。本质上,SQL Server 将事物转换为标准格式,以使其更容易在内部使用。这发生在不同的时间,包括在解析期间,以及查询编译和优化的规范化阶段。
就
CAST
对比CONVERT
而言,它可能只是CONVERT
第一个(和/或因为它提供了功能的超集)。您应该会发现内置(内部)函数通常是首选。