Vérifier les contraintes et l'énoncé de cas

J'ai besoin d'aide avec cette contrainte de vérification, j'obtiens le message d'erreur suivant: "Msg 102, niveau 15, état 1, ligne 14 Syntaxe incorrecte près de '='."

Ou peut-être la question que je devrais poser est si cela est possible en utilisant une contrainte de vérification

Ce que j'essaie de réaliser est: Si InformationRessortingcted est vrai, InformationNotRessortingcted ne peut pas être vrai et InformationRessortingctedFromLevel1, InformationRessortingctedFromLevel2, InformationRessortingctedFromLevel3, InformationRessortingctedFromLevel4, InformationRessortingctedFromLevel5 ne peut pas être vrai

Je n'essaie pas d'assigner des valeurs aux colonnes, juste en essayant de m'assurer que les valeurs des colonnes = 0 (ie false) si InformationRessortingcted est True

Voici le script:

CREATE TABLE EmployeeData (FirstName varchar(50), Last Name varchar(50), Age int, Address varchar(100), InformationRessortingcted bit, InformationNotRessortingcted bit, InformationRessortingctedFromLevel1 bit, InformationRessortingctedFromLevel2 bit InformationRessortingctedFromLevel3 bit InformationRessortingctedFromLevel4 bit InformationRessortingctedFromLevel5 bit); ALTER TABLE EmployeeData ADD CONSTRAINT ck_EmployeeData CHECK (CASE WHEN InformationRessortingcted = 1 THEN InformationNotRessortingcted = 0 --InformationRessortingcted is true, InformationNotRessortingcted is false AND( InformationRessortingctedFromLevel1 = 0 --is false OR InformationRessortingctedFromLevel2 = 0 --is false OR InformationRessortingctedFromLevel3 = 0 --is false OR InformationRessortingctedFromLevel4 = 0 --is false OR InformationRessortingctedFromLevel5 = 0)); --is false 

Une expression CASE est quelque chose qui renvoie une valeur d'un type de données particulier (le type doit être déterminé par les différents types de données de chaque clause THEN ).

SQL Server n'a pas de type de données boolean. Vous ne pouvez donc pas renvoyer le résultat d'une opération de comparaison.

Essayez d'append des comparaisons supplémentaires dans les clauses WHEN , et d'avoir le return de THEN soit 1 ou 0, si vous voulez autoriser ou interdire le résultat (respectivement). Puis comparez le résultat global à 1.

Je ne peux pas parsingr entièrement le sens de votre condition, mais quelque chose comme:

 CHECK(CASE WHEN InformationRessortingcted = 1 THEN CASE WHEN InformationNotRessortingcted = 0 AND (InformationRessortingctedFromLevel1 = 0 --is false OR InformationRessortingctedFromLevel2 = 0 --is false OR InformationRessortingctedFromLevel3 = 0 --is false OR InformationRessortingctedFromLevel4 = 0 --is false OR InformationRessortingctedFromLevel5 = 0) THEN 1 ELSE 0 END --Other conditions? END = 1) 

Ma confusion est que je voudrais que vous vérifiiez qu'une et une seule des colonnes InformationRessortingctedFromXXX soit une. En fait, à partir de la description générale, (sans en savoir plus sur votre domaine de problème), j'aurais probablement créé une colonne InformationRessortingctionLevel , de type int , avec 0 signifiant sans ressortingction, et des valeurs plus élevées indiquant le niveau à partir duquel elle est restreinte.

On dirait que vous ne fermez pas l' case avec la end . Le format de base d'une contrainte de vérification utilisant case est:

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

Si vous imbriquez plusieurs cas, assurez-vous de faire correspondre le nombre de cas avec le nombre de fins:

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

Le formatting de tous les éléments d'un même case avec la même indentation peut être d'une grande aide.