2011-08-16 11 views
4

このチェック制約の助けが必要な場合、次のエラーメッセージが表示されます。 "メッセージ102、レベル15、状態1、行14 = ''制約とケースステートメントのチェック

それとも私が尋ねるべき質問、これはチェック制約

を使用して可能である場合である私が達成しようとしています:InformationRestrictedがTrueの場合、InformationNotRestrictedが真とInformationRestrictedFromLevel1、InformationRestrictedFromLevel2、InformationRestrictedFromLevel3、InformationRestrictedFromLevel4することはできません、 InformationRestrictedFromLevel5はちょうど列の値を確保しようと、私は列に値を代入しようとしていないのです

trueにすることはできません= 0(すなわち偽)InformationRestrictedがTrueの場合

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 sが、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のうちの1つだけが1であることを確認したい。実際には、(あなたの問題のドメインについてもっと知らないで)一般的な説明から、私はおそらく0の意味があるInformationRestrictionLevelというタイプのintというコラムを作成していました。

+0

内側のCASEはおそらく外側のCASEとマージできます。 +1とにかく、これは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は大きな助けになることができます。