1 つの解決策は、値をアルメニア語の照合順序に変換し、次のように小文字に設定する各テキスト列の計算列を作成することです。
Alter Table TableName
Add TextValueArmenian As ( LOWER(TextColumn COLLATE Latin1_General_CI_AS) ) PERSISTED
これを行うと、これらの列にインデックスを配置してクエリを実行できます。
それがあなたのお茶の味ではない場合、別の解決策はSCHEMABINDING
、さまざまな列のそれぞれを小文字および正しい照合順序にキャストするビューを作成し、そのビューにインデックスを配置するインデックス付きビューです。
編集あなたの例では、大文字と小文字を区別せず、アクセントを区別するものを使用していることに気付きました。おそらく、注文の問題に対する簡単な解決策は、使用可能な場合は Latin1_General_CS_AS または Cyrillic_General_100_CS_AS を使用することです。
編集
うわー。かなりの調査の後、残念ながらあなたが望んでいないかもしれない答えがあると思います. まず、はい、提供されたテキストをコードまたは Notepad++ のようなものにコピーできます。これは、StackOverflow が UTF-8 を使用してエンコードされ、アルメニア語が UTF-8 に適合するためです。第二に、これはあなたが達成しようとしていること、つまりSQL ServerにUTF-8を格納することを示唆しています。残念ながら、SQL Server 2008 (またはそれ以前のバージョン) は UTF-8 をネイティブにサポートしていません。データを UTF-8 で保存するには、いくつかの選択肢があります。
- バイナリで保存し、クライアントで UTF-8 に変換します (これにより、サーバーで行われた並べ替えがほとんどなくなります)。
- Unicode で保存し、クライアントで UTF-8 に変換します。SQL Server ドライバーは既にほとんどの文字列を Unicode に変換しており、例は Unicode で正常に動作することに注意してください。明らかな欠点は、2 倍のスペースを占有することです。
- SQL Server で CLR ユーザー定義型を作成して、UTF-8 値を格納します。Microsoft は、これを行うために SQL Server に付属するサンプルを提供しています。ここから CodePlexのサンプルをダウンロードできます。サンプルの詳細については、 Books Onlineのこの記事を参照してください。欠点は、SQL Server で CLR を有効にする必要があり、それがどれほどうまく機能するかわかりません。
そうは言っても、SQL Server で Unicode を使用してサンプルを問題なく動作させることができました。
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)
これら 3 つのクエリはすべて同じ結果を返します。