我正在运行SQL Server 2012并发现通过在表定义中使用CASE WHEN
,服务器然后将表定义解析为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
);
语句。
T_TABLE.sql
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
);
在数据库中运行此代码后,我使用SSMS编写表定义脚本并获取以下内容:
IIF
这当然会导致运行git / schema差异时出现问题,说这两个表不相等。
是否有&#34;规则&#34;反对CASE WHEN
使用{{1}}?我总是发现前者对于创建标志/简单逻辑规则更为简洁。
答案 0 :(得分:3)
IIF
是用于使从MSAccess转换为SQL Server更容易的语法糖。从结果中可以清楚地看出,SQL Server在解析时只是将您输入的IIF
转换为更通用和ANSI兼容的CASE WHEN
构造。除了MS Access的可移植性之外,我绝不会建议使用IIF
。
您会发现SQL Server经常会重写计算列并检查约束以简化无偿括号和类似标准形式的内容,这样当您从SSMS编写脚本时,它可能与您的相同放入你的DDL。这显然是另一个案例。