Đây dường như là một trong nhiều hạn chế của các chỉ mục được lọc. Đang cố gắng bỏ qua nó vớiLIKE
cách sử dụng WHERE column01 LIKE '_____'
cũng không hoạt động, tạo ra cùng một thông báo lỗi ( "Mệnh đề WHERE không chính xác ..." ).
Bên cạnh VIEW
giải pháp, một cách khác là chuyển đổi cột được tính thành cột thông thường và thêm một CHECK
ràng buộc để nó luôn có dữ liệu hợp lệ:
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 ;
Đã thử nghiệm tại rextester.com
Đương nhiên, điều đó có nghĩa là bạn cần phải cư trú rõ ràng column01_length
với độ dài chính xác mỗi lần bạn nhập column01
(trên các bản chèn và cập nhật). Điều đó có thể khó khăn, bởi vì bạn cần đảm bảo rằng độ dài được tính giống như hàm T-SQL LEN()
thực hiện. Cụ thể, các khoảng trắng theo sau cần được bỏ qua, không nhất thiết là cách tính độ dài theo mặc định trong các ngôn ngữ lập trình khác nhau mà ứng dụng khách được viết. Logic có thể dễ dàng được giải thích trong trình gọi, nhưng bạn cần phải có nhận thức được sự khác biệt ở nơi đầu tiên.
Một tùy chọn sẽ là một INSERT/UPDATE
kích hoạt 1 để cung cấp giá trị chính xác cho cột, vì vậy nó xuất hiện dưới dạng tính toán cho các ứng dụng khách.
1 Như đã giải thích trong Triggers So với các ràng buộc , bạn sẽ cần sử dụng trình kích hoạt INSTEAD OF cho việc này. Một trình kích hoạt SAU đơn giản sẽ không bao giờ thực thi, bởi vì độ dài vắng mặt sẽ không thực hiện được ràng buộc kiểm tra và do đó, sẽ ngăn chặn trình kích hoạt chạy. Tuy nhiên, INSTEAD OF kích hoạt có những hạn chế riêng (xem Nguyên tắc lập kế hoạch kích hoạt DML để biết tổng quan nhanh).