To wydaje się być kolejnym z wielu ograniczeń filtrowanych indeksów. Próba obejścia go przy LIKE
użyciu WHERE column01 LIKE '_____'
również nie działa, co powoduje wyświetlenie tego samego komunikatu o błędzie ( „Niepoprawna klauzula WHERE ...” ).
Oprócz VIEW
rozwiązania innym sposobem byłoby przekonwertowanie kolumny obliczanej na zwykłą i dodanie CHECK
ograniczenia, 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_length
odpowiednią 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/UPDATE
wyzwalacz 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 ).