0

1 つまたは複数の SQL Server 2000 データベースからの 2 つの並べ替えられた文字列ストリームを C# でインメモリ マージして、1 つの並べ替えられたストリームにする必要があります。これらのデータ ストリームは巨大になる可能性があるため、両方のストリームをメモリに取り込みたくありません。代わりに、メモリ内の各ストリームから一度に 1 つのアイテムを保持し、各ステップで各ストリームの現在のアイテムを比較し、最小値を最終ストリームにプッシュし、適切なソース ストリームから次のアイテムをプルする必要があります。ただし、これを正しく行うには、メモリ内比較がデータベースの照合と一致する必要があります (ストリーム[A,B,C]と を考慮して[A,B,C]ください: 正しいマージされたシーケンスは ですが[A,A,B,B,C,C]、メモリ内比較が と考えるC < B場合、メモリ内マージは を生成A,A,BしますaBと aを見ているポイントCとなり、 が生成Cされ、正しくソートされていないストリームが生成されます。)

私の質問は、SQL Server 2000 の照合順序をSystem.StringComparisonC# の列挙型で模倣する方法、またはその逆の方法はありますか? 最も近いSystem.StringCompaison.Ordinalのは、データベース文字列をVARBINARY標準の順序に変換した結果を使用することですが、これは機能しますが、SQL クエリに句をVARBINARY追加するだけで済みます。ここで、X は、データベースを離れるときにすべての文字列を に変換し、メモリに入るときに文字列に戻すのではなく、順序付けします。"order by name collate X"VARBINARYVARBINARY

4

2 に答える 2

0

StringComparerクラスを見てください。これにより、で見られるよりも堅牢な文字と文字列の比較が可能になりますString.CompareCurrentCulture静的インスタンス( 、、 )の3つのセットとInvariantCultureOrdinalそれぞれの大文字と小文字を区別しないバージョンがあります。より専門的なカルチャの場合は、このStringComparer.Create()関数を使用して、特定のカルチャに関連付けられた比較子を作成できます。

于 2009-05-07T18:15:32.910 に答える
0

sql 2005では、dbエンジンがソートを行うためにOS呼び出しを行わないことを知っています。順序付けルールは、dbに静的に付属しています(サービスパックで更新される場合がありますが、OSでは変更されません)。したがって、バイナリ照合を使用しない限り、dbサーバーと同じコードがない限り、特定のアプリケーションコードのセットが同じ方法で順序付けできるとは言えません。

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

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

于 2009-05-07T18:16:55.293 に答える