0

我需要在 C# 中将来自一个或多个 SQL Server 2000 数据库的两个排序的字符串流在内存中合并到一个排序的流中。这些数据流可能很大,所以我不想将两个流都拉到内存中。相反,我需要在内存中的每个流中一次保留一个项目,并且在每个步骤中,比较每个流中的当前项目,将最小值推送到最终流中,然后从适当的源流中提取下一个项目。但是,要正确执行此操作,内存中的比较必须与数据库的排序规则相匹配(考虑流[A,B,C][A,B,C]:正确的合并序列是[A,A,B,B,C,C],但如果您的内存中比较认为,您的内存中C < B合并将产生A,A,B它将查看 aB和 aC, 并将产生C, 导致错误排序的流。)

所以,我的问题是:有没有办法用System.StringComparisonC# 中的枚举来模仿 SQL Server 2000 中的任何排序规则或反之亦然?我最接近的是使用System.StringCompaison.Ordinal转换为VARBINARY标准VARBINARY排序的数据库字符串的结果,这是可行的,但我宁愿只"order by name collate X"在我的 SQL 查询中添加一个子句,其中 X 是一些排序规则,其工作方式与VARBINARY排序,而不是将所有字符串在VARBINARY它们离开数据库时转换为字符串,然后在它们进入内存时转换为字符串。

4

2 回答 2

0

看看StringComparer课堂。这提供了比使用String.Compare. 有三组静态实例(CurrentCultureInvariantCultureOrdinal)和每组的不区分大小写的版本。对于更专业的文化,您可以使用该StringComparer.Create()函数创建与特定文化相关的比较器。

于 2009-05-07T18:15:32.910 回答
0

使用 sql 2005,我知道 db 引擎不会调用 OS 来进行排序,排序规则是静态随 db 一起提供的(可能会随服务包更新,但不会随操作系统而改变)。所以我不认为你可以肯定地说一组给定的应用程序代码可以以相同的方式排序,除非你有与数据库服务器相同的代码,除非你使用二进制排序规则。

但是,如果您在数据库和客户端代码中使用二进制排序规则,您应该完全没有问题。

编辑 - 任何以 _BIN 结尾的排序规则都会给你二进制排序。排序规则名称的其余部分将确定用于存储 CHAR 数据的代码页,但不会影响排序。_BIN 表示严格的二进制排序。请参阅http://msdn.microsoft.com/en-us/library/ms143515(SQL.90).aspx

于 2009-05-07T18:16:55.293 回答