2017-03-11 66 views
0

我正在運行SQL Server 2012,並通過在表定義中使用IIF找到該服務器,然後將該表定義爲CASE WHEN語句。表中的IIF解析爲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腳本表定義並得到數據庫運行此代碼後,以下:

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時導致問題/ schema不同意說這兩個表不相等。

是否有一個「規則」反對使用IIF而不是CASE WHEN?我總是發現前者更容易創建標誌/簡單邏輯規則。

+2

只要使用'CASE'。這是ANSI標準。 –

回答

1

IIF是使從MSAccess轉換到SQL Server更簡單的語法糖。從您顯示的結果中可以清楚地看出,SQL Server只是簡單地將您輸入的IIF轉換爲解析它時的更一般和兼容ANSI的CASE WHEN構造。我絕不會推薦使用IIF以外的MS Access的可移植性。

你會發現SQL Server通常會重寫計算列和檢查約束條件,以便將標準格式的無理括號和類似事件簡化,這樣,當您將其腳本編寫出SSMS時,它可能與您放入的內容不一致在你的DDL中。這顯然是另一種情況。