Це здається ще одним із багатьох обмежень відфільтрованих індексів. Спроба обійти його за LIKE
допомогою WHERE column01 LIKE '_____'
також не працює, видаючи те саме повідомлення про помилку ( "Неправильне положення WHERE ..." ).
Окрім VIEW
рішення, іншим способом було б перетворення обчисленого стовпця у звичайний стовпчик та додавання CHECK
обмеження, щоб у ньому завжди були дійсні дані:
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 ;
Випробувано на сайті rextester.com
Звичайно, це означає, що вам потрібно чітко заповнювати column01_length
правильну довжину щоразу, коли ви вводите column01
(при вставках та оновленнях). Це може бути складним, адже вам потрібно переконатися, що довжина обчислюється так само, як це LEN()
робить функція T-SQL . Зокрема, слід проігнорувати пробіли, які не слід, як необов'язково, як обчислюється довжина за замовчуванням у різних мовах програмування, на яких записані клієнтські програми. Логіка може бути легко врахувати у абонента, але вам потрібно бути усвідомлюючи різницю в першу чергу.
Варіантом буде INSERT/UPDATE
тригер 1 для надання правильного значення стовпця, тому він відображається як обчислений для клієнтських програм.
1 Як пояснено в тригерах порівняно з обмеженнями , вам потрібно буде використовувати для цього тригер INSTEAD OF. ПІСЛЯ тригер просто ніколи не виконується, оскільки відсутня довжина не зможе перевірити обмеження, а це, в свою чергу, не дозволить триггеру запускатися. Однак встановити тригери мають свої обмеження ( для швидкого огляду див. Посібники з планування тригерів DML ).