To wydaje się być kolejnym z wielu ograniczeń filtrowanych indeksów. Próba obejścia go przy LIKEużyciu WHERE column01 LIKE '_____'również nie działa, co powoduje wyświetlenie tego samego komunikatu o błędzie ( „Niepoprawna klauzula WHERE ...” ).
Oprócz VIEWrozwiązania innym sposobem byłoby przekonwertowanie kolumny obliczanej na zwykłą i dodanie CHECKograniczenia, tak aby zawsze zawierało prawidłowe dane:
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 ;
Testowany na rextester.com
Oczywiście oznacza to, że musisz jawnie wypełnić column01_lengthodpowiednią długość przy każdym wypełnianiu column01(w przypadku wstawek i aktualizacji). Może to być trudne, ponieważ musisz upewnić się, że długość jest obliczana w taki sam sposób, jak LEN()robi to funkcja T-SQL . W szczególności należy pominąć końcowe spacje, co niekoniecznie jest domyślnym sposobem obliczania długości w różnych językach programowania, w których zapisywane są aplikacje klienckie. Logika może być łatwa do uwzględnienia w programie wywołującym, ale musisz być świadomy różnicy w pierwszej kolejności.
Opcją może być INSERT/UPDATEwyzwalacz 1, który poda poprawną wartość dla kolumny, więc wygląda na obliczoną dla aplikacji klienckich.
1 Jak wyjaśniono w Wyzwalacze w porównaniu do ograniczeń , w tym celu należy użyć wyzwalacza INSTEAD OF. Wyzwalacz PO, po prostu nigdy się nie wykona, ponieważ nieobecna długość nie spełni ograniczenia sprawdzania, a to z kolei uniemożliwi uruchomienie wyzwalacza. INSTEAD OF wyzwalaczy ma jednak swoje własne ograniczenia (zobacz Krótki przewodnik dotyczący planowania wyzwalaczy DML ).