Ini tampaknya menjadi salah satu dari banyak batasan indeks yang difilter. Mencoba memintasnya dengan LIKE
menggunakan WHERE column01 LIKE '_____'
tidak berhasil, menghasilkan pesan kesalahan yang sama ( "Klausa WHERE WHERE ..." ).
Selain VIEW
solusinya, cara lain adalah dengan mengonversi kolom yang dihitung menjadi kolom biasa dan menambahkan CHECK
kendala sehingga selalu memiliki data yang valid:
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 ;
Diuji di rextester.com
Secara alami, itu berarti Anda harus secara eksplisit mengisi column01_length
dengan panjang yang benar setiap kali Anda mengisi column01
(pada sisipan dan pembaruan). Itu mungkin rumit, karena Anda perlu memastikan bahwa panjangnya dihitung dengan cara yang sama seperti fungsi T-SQL LEN()
melakukannya. Secara khusus, spasi tambahan perlu diabaikan, yang belum tentu bagaimana panjangnya dihitung secara default dalam berbagai bahasa pemrograman tempat aplikasi klien ditulis. Logikanya mungkin mudah untuk diperhitungkan dalam pemanggil, tetapi Anda harus menyadari perbedaan di tempat pertama.
Opsi akan menjadi INSERT/UPDATE
pemicu 1 untuk menyediakan nilai yang benar untuk kolom, sehingga muncul sebagai dihitung untuk aplikasi klien.
1 Seperti yang dijelaskan dalam Pemicu Dibandingkan dengan Kendala , Anda perlu menggunakan BUKAN pemicu untuk ini. Pemicu SETELAH tidak akan pernah mengeksekusi, karena panjang yang tidak ada akan gagal kendala cek dan bahwa, pada gilirannya, akan mencegah pemicu dari berjalan. BUKAN pemicu, bagaimanapun, memiliki batasannya sendiri (lihat Pedoman Perencanaan Pemicu DML untuk ikhtisar singkat).