Tôi có một bảng như thế này với một cột tính:Không thể thêm chỉ số để tồn cột tính vì nó là "của một loại đó là không hợp lệ để sử dụng như một chìa khóa"
CREATE TABLE PhoneNumbers
(
[PhoneNumberID] int identity(1,1) not null primary key clustered,
[Number] varchar(20), /* Entire number, like (800) 555-5000 */
[Digits] AS dbo.RegExReplace(Number, '[^0-9]', '') PERSISTED /* Like 8005555000 */
)
Nó tạo tốt, và cột Digits
hoạt động tốt như mong đợi, NHƯNG nó dường như không hoạt động như một cột "ĐÃ ĐƯỢC". Khi tôi làm một truy vấn với Digits
trong mệnh đề WHERE nó rất chậm. Khi tôi cố gắng thêm chỉ mục vào cột Chữ số, tôi nhận được: Column 'Digits' in table 'PhoneNumbers' is of a type that is invalid for use as a key column in an index.
Có vẻ như cột đó không thực sự được coi là PERSISTED và đang được tính toán lại trên mọi truy vấn và sẽ không cho phép tôi thêm chỉ mục.
Các REGEXREPLACE là một C# CLR chức năng được xác định như sau:
[SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlString RegExReplace(SqlString expression, SqlString pattern, SqlString replace)
Bất kỳ ý tưởng về làm thế nào để có được điều đó Digits
cột để hành động như một cột tiếp tục tồn tại hoặc cho phép tôi thêm một chỉ số ?!
Cảm ơn bạn!
Tôi sẽ không thiết kế như vậy. Tôi sẽ không lưu trữ bất cứ thứ gì trừ chữ số và tôi sẽ sử dụng giao diện người dùng để thực thi bất kỳ mẫu nào. Đó là overdesign, IMO. –
Vâng, có thể bạn đã đúng, nhưng đây là cơ sở dữ liệu kế thừa có nhiều bản ghi đã có trong đó và nhiều điểm vào cho các bản ghi này. Tôi nghĩ đây có thể là một bản vá dễ dàng hơn để có được những con số mà không cần phải thay đổi mã ở 10 địa điểm khác nhau. (Cột "Chữ số" thực sự là một cột mới, không phải là một phần của thiết kế ban đầu) – JerSchneid