2011-08-16 57 views
4

我需要此檢查約束的幫助,我收到以下錯誤消息:「Msg 102,Level 15,State 1,Line 14 '='附近的語法不正確。檢查約束和個案陳述

或者這個問題我要問的是,如果這是可能的使用檢查約束

我想實現的是:如果InformationRestricted爲True,InformationNotRestricted不可能是真實的和InformationRestrictedFromLevel1,InformationRestrictedFromLevel2,InformationRestrictedFromLevel3,InformationRestrictedFromLevel4, InformationRestrictedFromLevel5不可能是真的

我不是要分配值列,只是想確保列的值= 0(即假)如果InformationRestricted是真

這裏是腳本:

CREATE TABLE EmployeeData 
    (FirstName varchar(50), 
    Last Name varchar(50), 
    Age int, 
    Address varchar(100), 
    InformationRestricted bit, 
    InformationNotRestricted bit, 
    InformationRestrictedFromLevel1 bit, 
    InformationRestrictedFromLevel2 bit 
    InformationRestrictedFromLevel3 bit 
    InformationRestrictedFromLevel4 bit 
    InformationRestrictedFromLevel5 bit); 

    ALTER TABLE EmployeeData ADD CONSTRAINT ck_EmployeeData 
    CHECK (CASE WHEN InformationRestricted = 1 THEN InformationNotRestricted = 0   --InformationRestricted is true, InformationNotRestricted is false 
    AND(InformationRestrictedFromLevel1 = 0 --is false 
    OR InformationRestrictedFromLevel2 = 0 --is false 
    OR InformationRestrictedFromLevel3 = 0 --is false 
    OR InformationRestrictedFromLevel4 = 0 --is false 
    OR InformationRestrictedFromLevel5 = 0)); --is false 

回答

6

CASE表達是什麼,返回一個特定的數據類型(由每個THEN子句的各種數據類型來確定的類型)的值。

SQL Server沒有一個布爾數據類型,所以你不能返回比較操作的結果。

嘗試向WHEN子句中添加其他比較,如果要允許或不允許結果(分別),則使THEN返回1或0。再比較總的結果爲1

我無法解析出完全你的病情的感覺,但這樣的:

CHECK(CASE WHEN InformationRestricted = 1 THEN 
    CASE WHEN InformationNotRestricted = 0 AND 
     (InformationRestrictedFromLevel1 = 0 --is false 
     OR InformationRestrictedFromLevel2 = 0 --is false 
     OR InformationRestrictedFromLevel3 = 0 --is false 
     OR InformationRestrictedFromLevel4 = 0 --is false 
     OR InformationRestrictedFromLevel5 = 0) 
     THEN 1 
     ELSE 0 
    END 
--Other conditions? 
END = 1) 

我的困惑是我不得不雖然你會想要檢查InformationRestrictedFromXXX列中的哪一列是唯一一個。實際上,從一般描述(不知道更多關於您的問題域),我可能剛剛創建了一列InformationRestrictionLevel,類型爲int,其中0意味着不受限制,而較高的值指示受限制的級別。

+0

內部CASE可能可以與外部合併。無論如何,這是CASE的工作原理。 –

+0

非常感謝,這工作 – temitaio

3

看起來像你沒有關閉caseend。使用時,檢查約束的基本格式是:

check(case when <condition> then 1 else 0 end = 1) 

如果你嵌套多個的情況下,一定要案件的數量與端數量相匹配:格式化的所有元素

check 
(
    1 = 
    case 
    when <condition> then 
     case 
     when <condition> then 1 
     else 0 
     end 
    else 0 
    end 
) 

相同的case具有相同的縮進可以得到很大的幫助。