Table 中的 IIF 定义解析为 CASE WHEN

IIF in Table Definition resolving to CASE WHEN

我是 运行 SQL Server 2012,发现通过在 table 定义中使用 IIF,服务器随后将 table 定义解析为CASE WHEN 语句。

T_TABLE.sql

CREATE TABLE [dbo].[T_TABLE] (
    [ID] INT IDENTITY (1, 1) NOT NULL,
    [FLG] AS (IIF ([COL1] = [COL2] AND [STATUS] <> 'FAIL', 1, 0)),
    [COL1] INT NULL,
    [COL2] INT NULL,
    [STATUS] VARCHAR (2000) NULL
);

在数据库中 运行 这段代码之后,我使用 SSMS 编写 table 定义的脚本并获得以下内容:

CREATE TABLE [dbo].[T_TABLE] (
    [ID] INT IDENTITY (1, 1) NOT NULL,
    [FLG] AS (case when [COL1]=[COL2] AND [STATUS]<>'FAIL' then (1) else (0) end),
    [COL1] INT NULL,
    [COL2] INT NULL,
    [STATUS] VARCHAR (2000) NULL
);

当 运行 git / 模式差异表明这两个 table 不相等时,这当然会导致问题。

是否有人 "rule" 反对使用 IIF 而不是 CASE WHEN?我一直发现前者在创建标志/简单逻辑规则方面更简洁。

IIF 是使从 MSAccess 转换到 SQL 服务器更容易的语法糖。从显示的结果中可以清楚地看出,SQL 服务器在解析时只是将您输入的 IIF 转换为更通用且与 ANSI 兼容的 CASE WHEN 结构。除了可移植性 to/from MS Access.

,我绝不会推荐使用 IIF

你会发现 SQL 服务器会经常重写计算列和检查约束以将无偿括号和类似的东西简化为标准化形式,这样当你用 SSMS 编写脚本时它可能不会与您放入 DDL 中的内容相同。这显然是另一个案例。