Dies scheint eine weitere der vielen Einschränkungen von gefilterten Indizes zu sein. Der Versuch, es mit LIKE
using zu umgehen , WHERE column01 LIKE '_____'
funktioniert ebenfalls nicht und erzeugt dieselbe Fehlermeldung ( "Incorrect WHERE-Klausel ..." ).
Neben der VIEW
Lösung besteht eine andere Möglichkeit darin, die berechnete Spalte in eine reguläre Spalte umzuwandeln und eine CHECK
Einschränkung hinzuzufügen , damit sie immer gültige Daten enthält:
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 ;
Getestet bei rextester.com
Das bedeutet natürlich, dass Sie column01_length
bei jedem Auffüllen column01
(bei Einfügungen und Aktualisierungen) explizit die richtige Länge angeben müssen. Dies kann schwierig sein, da Sie sicherstellen müssen, dass die Länge auf dieselbe Weise berechnet wird wie in T-SQLLEN()
Funktion. Insbesondere müssen die nachgestellten Leerzeichen ignoriert werden. Dies muss nicht unbedingt der Fall sein, wenn die Länge in verschiedenen Programmiersprachen, in denen Clientanwendungen geschrieben sind, standardmäßig berechnet wird erstens bewusst den Unterschied.
Eine Option wäre ein INSERT/UPDATE
Trigger 1 , um den korrekten Wert für die Spalte bereitzustellen, sodass diese für Clientanwendungen als berechnet angezeigt wird.
1 Wie in Trigger im Vergleich zu Constraints erläutert , müssten Sie hierfür einen INSTEAD OF-Trigger verwenden. Ein AFTER-Trigger würde einfach niemals ausgeführt, da die fehlende Länge die Prüfbedingung nicht erfüllen würde und dies wiederum die Ausführung des Triggers verhindern würde. STATT Trigger haben jedoch ihre eigenen Einschränkungen ( eine schnelle Übersicht finden Sie in den DML-Trigger-Planungsrichtlinien ).