Одним из решений было бы создание вычисляемого столбца для каждого текстового столбца, который преобразует значение в армянское сопоставление и устанавливает его в нижний регистр следующим образом:
Alter Table TableName
Add TextValueArmenian As ( LOWER(TextColumn COLLATE Latin1_General_CI_AS) ) PERSISTED
Как только вы это сделаете, вы можете поместить индексы в эти столбцы и запросить их.
Если это не ваш вкус чая, тогда другим решением будет индексированное представление, в котором вы создаете представление с SCHEMABINDING
, которое переводит каждый из различных столбцов в нижний регистр и в правильное сопоставление, а затем помещает индексы в это мнение.
РЕДАКТИРОВАТЬ Я заметил в ваших примерах, что вы используете регистр-нечувствительный, акцент-чувствительный. Возможно, простым решением ваших проблем с заказом было бы использовать Latin1_General_CS_AS или Cyrillic_General_100_CS_AS, если доступно.
EDIT
Уф. После небольшого исследования, я думаю, у меня есть ответ, который, к сожалению, может быть, вам не понадобится. Во-первых, да, я могу скопировать предоставленный вами текст в код или что-то вроде Notepad ++, потому что StackOverflow кодируется с использованием UTF-8, а армянский будет вписываться в UTF-8. Во-вторых, это намекает на то, что вы пытаетесь достичь: хранение UTF-8 в SQL Server. К сожалению, SQL Server 2008 (или любая предыдущая версия) изначально не поддерживает UTF-8. Для хранения данных в UTF-8 у вас есть несколько вариантов:
- Сохраните его в двоичном виде и преобразуйте в UTF-8 на клиенте (что практически исключает любую сортировку, выполняемую на сервере)
- Сохраните его в Unicode и преобразуйте в UTF-8 на клиенте. Следует отметить, что драйвер SQL Server уже преобразует большинство строк в Unicode, и ваш пример отлично работает в Unicode. Очевидным недостатком является то, что он съедает вдвое больше места.
- Создайте пользовательский тип CLR в SQL Server для хранения значений UTF-8. Microsoft предоставляет пример, который поставляется с SQL Server, чтобы сделать это. Вы можете скачать образцы из CodePlex здесь . Вы также можете найти больше информации об образце в этой статье в Books Online . Недостатком является то, что вы должны включить CLR в SQL Server, и я не уверен, насколько хорошо он будет работать.
Теперь, как говорится, я смог без проблем получить пример работы с использованием Unicode в SQL Server.
If object_id('tempdb..#Test') Is Not Null
Drop Table #Test
GO
Create Table #Test
(
EntrySort int identity(1,1) not null
, ProperSort int
, MixedCase nvarchar(50)
, Lowercase nvarchar(50)
)
GO
Insert #Test(ProperSort, MixedCase, Lowercase)
Select 1, N'ԱբԳդԵզ',N'աբգդեզ'
Union All Select 6, N'ԵլԲնՆն',N'ելբննն'
Union All Select 2, N'ԱգԳսԴԼ',N'ագգսդլ'
Union All Select 3, N'ԲաԴֆդԴ',N'բադֆդդ'
Union All Select 4, N'ԳԳԼասա',N'գգլասա'
Union All Select 5, N'ԴմմլօՏ',N'դմմլօտ'
Union All Select 9, N'ԸխԾդսՂ',N'ըխծդսղ'
Union All Select 7, N'ԶՎլուտ',N'զվլուտ'
Union All Select 10, N'ԹԶէըԿր',N'թզէըկր'
Union All Select 8,N'էԹփձջՐ',N'էթփձջր'
Select * From #Test Order by ProperSort
Select * From #Test Order by Lowercase
Select * From #Test Order by Lower(MixedCase)
Все три из этих запросов возвращают один и тот же результат.