Bu, filtrelenmiş dizinlerin birçok sınırlamasından biri gibi görünüyor. LIKE
Kullanarak atlamaya WHERE column01 LIKE '_____'
çalışmak da aynı hata iletisini ( "Yanlış WHERE yan tümcesi ..." ) üreterek çalışmaz .
VIEW
Çözümün yanı sıra, hesaplanan sütunu normal bir sütuna dönüştürmek ve CHECK
her zaman geçerli verilere sahip olacak şekilde bir kısıtlama eklemek başka bir yol olacaktır :
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'da test edildi
Doğal olarak, bu, column01_length
her doldurduğunuzda column01
(eklemelerde ve güncellemelerde) açıkça doğru uzunlukta doldurmanız gerektiği anlamına gelir . Bu zor olabilir, çünkü uzunluğun T-SQL LEN()
işlevinin yaptığı gibi hesaplandığından emin olmanız gerekir . Özellikle, sondaki boşlukların göz ardı edilmesi gerekir, bu da istemci uygulamalarının yazıldığı çeşitli programlama dillerinde uzunluk varsayılan olarak nasıl hesaplanacağı anlamına gelmez. ilk etapta farkın farkında.
Bir seçenek , sütun için doğru değeri sağlamak üzere bir INSERT/UPDATE
tetikleyici 1 olacaktır, bu nedenle istemci uygulamalarına hesaplanmış olarak görünür.
1 Kısıtlayıcılarla karşılaştırıldığında Tetikleyiciler'de açıklandığı gibi , bunun için bir INSTEAD OF tetikleyicisi kullanmanız gerekir. AFTER tetikleyicisi hiçbir zaman yürütülmez, çünkü eksik uzunluk kontrol kısıtlamasında başarısız olur ve bu da tetikleyicinin çalışmasını önler. Bununla birlikte, INSTEAD OF tetikleyicilerin kendi kısıtlamaları vardır ( hızlı bir genel bakış için DML Tetikleyici Planlama Yönergeleri'ne bakın).