Cela semble être une autre des nombreuses limitations des index filtrés. Essayer de le contourner avec LIKE
using WHERE column01 LIKE '_____'
ne fonctionne pas non plus, produisant le même message d'erreur ( "clause WHERE incorrecte ..." ).
Outre la VIEW
solution, une autre façon serait de convertir la colonne calculée en une colonne régulière et d'ajouter une CHECK
contrainte pour qu'elle ait toujours des données valides:
CREATE TABLE Table01 (column01 nvarchar(100),
column01_length int,
CHECK ( column01_length = len(column01)
AND column01 IS NOT NULL
AND column01_length IS NOT NULL
OR column01 IS NULL
AND column01_length IS NULL )
) ;
CREATE UNIQUE INDEX UIX_01 ON Table01 (column01) WHERE column01_length >= 5 ;
Testé sur rextester.com
Naturellement, cela signifie que vous devez remplir explicitement column01_length
avec la bonne longueur à chaque fois que vous remplissez column01
(sur les insertions et les mises à jour). Cela peut être délicat, car vous devez vous assurer que la longueur est calculée de la même manière que la fonction T-SQL LEN()
. En particulier, les espaces de fin doivent être ignorés, ce qui n'est pas nécessairement la façon dont la longueur est calculée par défaut dans divers langages de programmation dans lesquels les applications clientes sont écrites. La logique peut être facile à prendre en compte dans l'appelant, mais vous devez être conscient de la différence en premier lieu.
Une option serait un INSERT/UPDATE
déclencheur 1 pour fournir la valeur correcte pour la colonne, elle apparaît donc comme calculée pour les applications clientes.
1 Comme expliqué dans Déclencheurs par rapport aux contraintes , vous devez utiliser un déclencheur INSTEAD OF pour cela. Un déclencheur AFTER ne s'exécuterait tout simplement jamais, car la longueur absente ferait échouer la contrainte de vérification et, à son tour, empêcherait le déclencheur de s'exécuter. Cependant, les déclencheurs INSTEAD OF ont leurs propres restrictions (voir les directives de planification des déclencheurs DML pour un aperçu rapide).