Sử dụng UDT SQLCLR. Điều này có thể hoạt động, mặc dù không rõ liệu nó có mang lại lợi nhuận ròng so với phương pháp được mô tả ở trên hay không.
Có, một UDT SQLCLR có thể có các toán tử so sánh được ghi đè bằng các thuật toán tùy chỉnh. Điều này xử lý các tình huống trong đó giá trị đang được so sánh với một giá trị khác đã cùng loại tùy chỉnh hoặc một loại cần được chuyển đổi hoàn toàn. Điều này sẽ xử lý bộ lọc phạm vi trong một WHERE
điều kiện.
Liên quan đến việc sắp xếp UDT như một loại cột thông thường (không phải là cột được tính toán), điều này chỉ có thể nếu UDT là "byte được đặt hàng". Được "sắp xếp theo byte" có nghĩa là biểu diễn nhị phân của UDT (có thể được định nghĩa trong UDT) sắp xếp theo thứ tự một cách tự nhiên. Giả sử rằng biểu diễn nhị phân được xử lý tương tự như cách tiếp cận được mô tả ở trên cho cột VARCHAR (50) có các đoạn có độ dài cố định được đệm, sẽ đủ điều kiện. Hoặc, nếu không dễ để đảm bảo rằng biểu diễn nhị phân sẽ tự nhiên được sắp xếp theo cách thích hợp, bạn có thể hiển thị một phương thức hoặc thuộc tính của UDT tạo ra một giá trị sẽ được sắp xếp đúng, và sau đó tạo một PERSISTED
cột được tính toán trên đó phương pháp hoặc tài sản. Phương pháp cần phải được xác định và đánh dấu là IsDeterministic = true
.
Lợi ích của phương pháp này là:
- Không cần trường "giá trị gốc".
- Không cần phải gọi UDF để chèn dữ liệu hoặc so sánh các giá trị. Giả sử rằng
Parse
phương thức của UDT nhận P7B18
giá trị và chuyển đổi nó, thì bạn sẽ có thể chỉ cần chèn các giá trị một cách tự nhiên như P7B18
. Và với phương thức chuyển đổi ngầm định được đặt trong UDT, điều kiện WHERE cũng sẽ cho phép sử dụng P7B18` đơn giản.
Hậu quả của phương pháp này là:
- Chỉ cần chọn trường sẽ trả về biểu diễn nhị phân, nếu sử dụng UDT theo thứ tự byte làm kiểu dữ liệu cột. Hoặc nếu sử dụng
PERSISTED
cột được tính toán trên một thuộc tính hoặc phương thức của UDT, thì bạn sẽ nhận được đại diện được trả về bởi thuộc tính hoặc phương thức. Nếu bạn muốn P7B18
giá trị ban đầu , thì bạn cần gọi một phương thức hoặc thuộc tính của UDT được mã hóa để trả về đại diện đó. Vì bạn phải ghi đè lênToString
dù sao phương thức, đó là một ứng cử viên tốt để cung cấp phương thức này.
Không rõ ràng (ít nhất là với tôi ngay bây giờ vì tôi chưa thử nghiệm phần này) việc thực hiện bất kỳ thay đổi nào đối với biểu diễn nhị phân sẽ dễ dàng / khó khăn như thế nào. Thay đổi đại diện được lưu trữ, có thể sắp xếp có thể yêu cầu bỏ và thêm lại trường. Ngoài ra, việc bỏ hội có chứa UDT sẽ thất bại nếu được sử dụng theo bất kỳ cách nào, vì vậy bạn sẽ muốn đảm bảo rằng không có gì khác trong hội ngoài UDT này. Bạn có thểALTER ASSEMBLY
thay thế định nghĩa, nhưng có một số hạn chế về điều đó.
Mặt khác, VARCHAR()
trường là dữ liệu bị ngắt kết nối với thuật toán nên sẽ chỉ yêu cầu cập nhật cột. Và nếu có hàng chục triệu hàng (hoặc nhiều hơn) thì điều đó có thể được thực hiện theo cách tiếp cận theo đợt.
Triển khai thư viện ICU thực sự cho phép thực hiện sắp xếp chữ và số này. Mặc dù có nhiều chức năng, thư viện chỉ có hai ngôn ngữ: C / C ++ và Java. Điều đó có nghĩa là bạn có thể cần phải thực hiện một số điều chỉnh để làm cho nó hoạt động trong Visual C ++ hoặc có khả năng mã Java có thể được chuyển đổi thành MSIL bằng IKVM . Có một hoặc hai dự án bên .NET được liên kết trên trang web đó cung cấp giao diện COM có thể được truy cập trong mã được quản lý, nhưng tôi tin rằng chúng chưa được cập nhật trong một thời gian và tôi đã không thử chúng. Đặt cược tốt nhất ở đây sẽ là xử lý việc này trong lớp ứng dụng với mục tiêu tạo ra các khóa sắp xếp. Các khóa sắp xếp sau đó sẽ được lưu vào một cột sắp xếp mới.
Đây có thể không phải là cách tiếp cận thực tế nhất. Tuy nhiên, vẫn rất tuyệt vời khi một khả năng như vậy tồn tại. Tôi đã cung cấp một hướng dẫn chi tiết hơn về một ví dụ về điều này trong câu trả lời sau:
Có đối chiếu để sắp xếp các chuỗi sau theo thứ tự sau 1,2,3,6,10,10A, 10B, 11 không?
Nhưng mô hình được giải quyết trong câu hỏi đó đơn giản hơn một chút. Để biết ví dụ cho thấy loại mẫu được xử lý trong Câu hỏi này cũng hoạt động, vui lòng truy cập trang sau:
Bản thử nghiệm đối chiếu ICU
Trong "Cài đặt", đặt tùy chọn "số" thành "bật" và tất cả các tùy chọn khác sẽ được đặt thành "mặc định". Tiếp theo, ở bên phải nút "sắp xếp", bỏ chọn tùy chọn cho "độ mạnh khác biệt" và kiểm tra tùy chọn cho "phím sắp xếp". Sau đó thay thế danh sách các mục trong vùng văn bản "Đầu vào" bằng danh sách sau:
P12B22
P7B18
P12B3
as456456hgjg6786867
P7Bb19
P7BA19
P7BB19
P007B18
P7Bb20
P7Bb19z23
Nhấp vào nút "sắp xếp". Vùng văn bản "Đầu ra" sẽ hiển thị như sau:
as456456hgjg6786867
29 4D 0F 7A EA C8 37 35 3B 35 0F 84 17 A7 0F 93 90 , 0D , , 0D .
P7B18
47 0F 09 2B 0F 14 , 08 , FD F1 , DC C5 DC 05 .
P007B18
47 0F 09 2B 0F 14 , 08 , FD F1 , DC C5 DC 05 .
P7BA19
47 0F 09 2B 29 0F 15 , 09 , FD FF 10 , DC C5 DC DC 05 .
P7Bb19
47 0F 09 2B 2B 0F 15 , 09 , FD F2 , DC C5 DC 06 .
P7BB19
47 0F 09 2B 2B 0F 15 , 09 , FD FF 10 , DC C5 DC DC 05 .
P7Bb19z23
47 0F 09 2B 2B 0F 15 5B 0F 19 , 0B , FD F4 , DC C5 DC 08 .
P7Bb20
47 0F 09 2B 2B 0F 16 , 09 , FD F2 , DC C5 DC 06 .
P12B3
47 0F 0E 2B 0F 05 , 08 , FD F1 , DC C5 DC 05 .
P12B22
47 0F 0E 2B 0F 18 , 08 , FD F1 , DC C5 DC 05 .
Xin lưu ý rằng các khóa sắp xếp là cấu trúc trong nhiều trường, được phân tách bằng dấu phẩy. Mỗi trường cần được sắp xếp độc lập, để đưa ra một vấn đề nhỏ khác cần giải quyết nếu cần thực hiện điều này trong SQL Server.
P7B12
có thể trở thànhP 07 B 12
, sau đó (thông qua ASCII)80 07 65 12
, vì vậy80076512