Використовуйте UDT SQLCLR. Це могло б спрацювати, хоча незрозуміло, якщо він представляє чистий прибуток порівняно з описаним вище підходом.
Так, UDT SQLCLR може мати операторів порівняння, які перекривають користувацькі алгоритми. Це обробляє ситуації, коли значення порівнюється або з іншим значенням, яке вже є тим самим спеціальним типом, або з таким, яке потрібно неявно перетворити. Це повинно працювати з фільтром діапазону в WHERE
стані.
Що стосується сортування UDT як звичайного типу стовпців (а не обчислених стовпців), то це можливо лише в тому випадку, якщо UDT є "упорядкованим байтом". Бути "упорядкованим байтом" означає, що двійкове представлення УДТ (яке можна визначити в УДТ) природно сортує у відповідному порядку. Якщо припустити, що бінарне представлення обробляється аналогічно описаному вище підходу для стовпця VARCHAR (50), який має вкладені сегменти фіксованої довжини, це може кваліфікувати. Або, якби було непросто переконатися, що бінарне представлення буде впорядковано належним чином, ви можете розкрити метод або властивість UDT, що виводить значення, яке було б належним чином упорядковано, а потім створити PERSISTED
обчислений стовпець на цьому метод або властивість. Метод повинен бути детермінованим і позначений як IsDeterministic = true
.
Переваги такого підходу:
- Немає необхідності в полі "початкове значення".
- Не потрібно викликати UDF для вставки даних або для порівняння значень. Якщо припустити, що
Parse
метод UDT приймає P7B18
значення і перетворює його, то ви повинні мати можливість просто вставити значення як природні P7B18
. І при непрямому методі перетворення, встановленому в UDT, умова WHERE також дозволить використовувати просто P7B18`.
Наслідки такого підходу:
- Простий вибір поля поверне бінарне представлення, якщо використовувати впорядкований байт UDT в якості типу даних стовпця. Або якщо ви використовуєте
PERSISTED
обчислений стовпець у властивості або методі UDT, ви отримаєте представлення, повернене властивістю або методом. Якщо ви хочете вихідне P7B18
значення, то вам потрібно викликати метод або властивість UDT, кодованих для повернення цього подання. Оскільки вам доведеться все-таки перекрити ToString
метод, це хороший кандидат для його надання.
Незрозуміло (принаймні, мені зараз, оскільки я не перевіряв цю частину), наскільки легко / важко було б внести будь-які зміни у бінарне представлення. Зміна збереженого сортового подання може зажадати відміни та повторного додавання поля. Крім того, скасування збірки, що містить UDT, не вдасться, якщо використовується будь-яким способом, тому ви хочете переконатися, що крім цього УДТ нічого іншого в Асамблеї не було. Ви можете ALTER ASSEMBLY
замінити визначення, але на це є деякі обмеження.
З іншого боку, VARCHAR()
поле - це дані, від'єднані від алгоритму, тому вимагатиме лише оновлення стовпця. І якщо є десятки мільйонів рядків (або більше), то це можна зробити за допомогою підхідного пакету.
Реалізуйте бібліотеку ICU, яка фактично дозволяє проводити це алфавітно-цифрове сортування. Хоча високофункціональна, бібліотека надходить лише двома мовами: C / C ++ та Java. Це означає, що вам може знадобитися зробити деякі налаштування, щоб змусити його працювати у Visual C ++, або є ймовірність виключення того, що код Java може бути перетворений у MSIL за допомогою IKVM . На цьому веб-сайті пов’язані один або два .NET-побічні проекти, які надають COM-інтерфейс, до якого можна отримати доступ у керованому коді, але я вважаю, що вони не оновлювались протягом певного часу, і я не пробував їх. Найкраще тут було б вирішити це в шарі програми з метою створення ключів сортування. Потім клавіші сортування будуть збережені в новий стовпчик сортування.
Це може бути не найбільш практичним підходом. Однак все ще дуже круто, що така здатність існує. Я детальніше ознайомився з прикладом цього в наступній відповіді:
Чи є порівняння для сортування наступних рядків у такому порядку 1,2,3,6,10,10A, 10B, 11?
Але модель, якою займаються в цьому питанні, трохи простіша. Для прикладу, який показує, що тип шаблону, який розглядається в цьому запитанні, також працює, перейдіть на наступну сторінку:
Демографічний показник співпраці ICU
У розділі "Налаштування" встановіть для параметра "число" значення "увімкнено", а всі інші слід встановити на "за замовчуванням". Далі, праворуч від кнопки "сортувати", зніміть прапорець для "різної сили" та поставте прапорець "сортувати клавіші". Потім замініть перелік елементів у текстовій області "Введення" таким списком:
P12B22
P7B18
P12B3
as456456hgjg6786867
P7Bb19
P7BA19
P7BB19
P007B18
P7Bb20
P7Bb19z23
Натисніть кнопку "сортувати". У текстовій області "Вихід" має відображатися наступне:
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 .
Зауважте, що клавіші сортування - це структура в декількох полях, розділених комами. Кожне поле потрібно сортувати самостійно, щоб представити ще одну невелику проблему, яку потрібно вирішити, якщо потрібно реалізувати це в SQL Server.
P7B12
могло б статиP 07 B 12
тоді (через ASCII)80 07 65 12
, таким чином80076512