Проверьте ограничения и описание ситуации - PullRequest
4 голосов
/ 16 августа 2011

Мне нужна помощь с этим проверочным ограничением, я получаю следующее сообщение об ошибке: «Msg 102, Уровень 15, Состояние 1, Строка 14 Неверный синтаксис рядом с '='."

Или, возможно, вопрос, который я долженСпросите, возможно ли это, используя проверочное ограничение

. Я пытаюсь добиться того, чтобы: если InformationRestricted имеет значение True, InformationNotRestricted не может быть истинным, а InformationRestrictedFromLevel1, InformationRestrictedFromLevel2, InformationRestrictedFromLevel3, InformationRestrictedFromLevel5 bee Information_ReesttedFromLevel5 be Information1006 * Я не пытаюсь присвоить значения столбцам, просто пытаюсь убедиться, что значения столбцов = 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

Ответы [ 2 ]

6 голосов
/ 16 августа 2011

A 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 будет одним. Фактически, из общего описания (не зная больше о вашей проблемной области), я бы, вероятно, просто создал столбец InformationRestrictionLevel, типа int, где 0 означает неограниченный, а более высокие значения указывают уровень ограничено.

3 голосов
/ 16 августа 2011

Похоже, вы не закрываете case с end.Базовый формат проверочного ограничения с использованием регистра:

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 с одинаковыми отступами могут оказать большую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...