2009-05-07 11 views
0

1つまたは複数のSQL Server 2000データベースからのソートされた2つのストリームのストリームを1つのソート済みストリームに変換するC#でメモリ内マージを行う必要があります。これらのデータストリームは膨大なものになる可能性があるため、両方のストリームをメモリに取り込む必要はありません。代わりに、メモリ内の各ストリームから一度に1つのアイテムを保持し、各ステップで各ストリームの現在のアイテムを比較し、最小値を最終ストリームにプッシュし、適切なソースストリームから次のアイテムを引き出す必要があります。ただし、メモリ内の比較はデータベースの照合と一致する必要があります(ストリーム[A,B,C][A,B,C]を考慮してください:正しいマージされたシーケンスは[A,A,B,B,C,C]ですが、メモリ内比較でC < Bと考える場合、メモリ内マージ。それはBを見ているだろう、その時点でA,A,B、およびCを与えるであろう、とCが得られる、間違って並べ替えられたストリームになる)SQL Server 2000でのVARCHAR照合とVARBINARYの並べ替え

をだから、私の質問は:のいずれかを模倣する方法はありますSQL Server 2000の照合順序はC#のSystem.StringComparison列挙型ですか?逆の場合は?私が最も近かったのはSystem.StringCompaison.Ordinalをデータベースの文字列の結果をVARBINARY標準のVARBINARYに変換したものです。これは動作しますが、私はむしろ"order by name collate X"句をSQLクエリに追加したいと思います。すべての文字列をVARBINARYに変換するのではなく、データベースを終了してメモリに入ったときに文字列に戻すときと同じように、VARBINARYのように動作します。

答えて

0

StringComparerクラスをご覧ください。これにより、より堅牢な文字と文字列の比較が、String.Compareよりも得られます。静的インスタンス(CurrentCulture,InvariantCulture,Ordinal)とそれぞれ大文字小文字を区別する3つのインスタンスがあります。より専門的な文化の場合は、StringComparer.Create()関数を使用して、特定の文化に関連付けられた比較者を作成できます。

0

sql 2005では、dbエンジンがソートを行うためにOS呼び出しを行わないことがわかっています。注文ルールはdbで静的に出荷されています(サービスパックで更新できますが、OSでは変更されません)。したがって、バイナリ照合を使用しない限り、dbサーバと同じコードを持たない限り、指定された一連のアプリケーションコードが同じ方法で並べ替えるとは限りません。

dbとクライアントコードでバイナリ照合を使用する場合は、まったく問題はありません。

EDIT - _BINで終わる照合は、バイナリソートを行います。残りの照合名は、CHARデータの格納に使用されるコード・ページを判別しますが、順序には影響しません。 _BINは厳密にバイナリソートを意味します。 http://msdn.microsoft.com/en-us/library/ms143515(SQL.90).aspx

+0

SQL Server 2000には_BINが適用されますか? –

+0

Latin1_General_BINとLatin1_General_BIN2を含むいくつかのBIN順序を試しましたが、StringComparison.Ordinalと同じではありません。私のテストケースには、特定の長さまでのすべてのバイト列を生成し、System.Text.Encoding.Unicode.GetStringで文字列に変換し、StringComparison.Ordinalでソートして、結果を「order Xを照合することによって "。 _BINまたは_BIN2の順序はメモリ内ソート順と一致していません。 –

+0

@larry - あなたはどのようにDBに文字列を生成していますか?ちょうどキャスト(0x .....のようにnvarchar(N))? – ahains

関連する問題