C# SQL Server 2000中的VARCHAR排序与VARBINARY排序

C# SQL Server 2000中的VARCHAR排序与VARBINARY排序,c#,sql-server,string,collation,C#,Sql Server,String,Collation,我需要在内存中用C将来自一个或多个SQLServer2000数据库的两个已排序字符串流合并到一个已排序的流中。这些数据流可能非常庞大,因此我不想将这两个数据流都拉入内存。相反,我需要在内存中每次从每个流中保留一个项,在每个步骤中,比较每个流中的当前项,将最小值推到最后一个流中,并从适当的源流中提取下一个项。为了正确地执行此操作,内存中的比较必须匹配数据库的排序规则,考虑流[a,b,c]和[a,b,c]:正确的合并序列是[a,a,b,b,c,c],但是如果内存中的比较认为c

我需要在内存中用C将来自一个或多个SQLServer2000数据库的两个已排序字符串流合并到一个已排序的流中。这些数据流可能非常庞大,因此我不想将这两个数据流都拉入内存。相反,我需要在内存中每次从每个流中保留一个项,在每个步骤中,比较每个流中的当前项,将最小值推到最后一个流中,并从适当的源流中提取下一个项。为了正确地执行此操作,内存中的比较必须匹配数据库的排序规则,考虑流[a,b,c]和[a,b,c]:正确的合并序列是[a,a,b,b,c,c],但是如果内存中的比较认为c
所以,我的问题是:有没有办法用C中的System.StringComparison枚举或反之亦然来模拟SQL Server 2000中的任何排序规则?我最接近的方法是使用System.StringCompaison.Ordinal,将数据库字符串的结果转换为VARBINARY,并使用标准的VARBINARY排序,这是可行的,但我更愿意在我的SQL查询中添加一个order by name collate X子句,其中X是与VARBINARY排序完全相同的排序规则,而不是在所有字符串离开数据库时将其转换为VARBINARY,然后在它们进入内存时再转换回字符串。

看看这个类。这提供了比string.Compare更健壮的字符和字符串比较。有三组静态实例,分别是CurrentCulture、InvariantCulture、Ordinal和case-insitive版本。对于更专业的区域性,您可以使用StringComparer.Create函数来创建绑定到特定区域性的比较器。

使用sql 2005,我知道db引擎不会进行操作系统调用来进行排序,排序规则是静态随附的,db可能会随service pack更新,但不会随操作系统而更改。因此,我不认为您可以安全地说,一组给定的应用程序代码可以以相同的方式排序,除非您拥有与db服务器相同的代码,除非您使用二进制排序规则

但是,如果在数据库和客户机代码中使用二进制排序规则,则应该没有任何问题


编辑-任何以_BIN结尾的排序规则都将为您提供二进制排序。排序规则名称的其余部分将确定用于存储字符数据的代码页,但不会影响排序。_BIN表示严格的二进制排序。请参见

您确定“BIN”适用于SQL Server 2000吗?我尝试了几种BIN排序,包括Latin1_General_BIN和Latin1_General_BIN2,但它们与StringComparison.Ordinal不同。我的测试用例包括生成特定长度的所有字节字符串,使用System.Text.Encoding.Unicode.GetString将它们转换为字符串,使用StringComparison.Ordinal对它们进行排序,并将结果与使用排序X从数据库中得出的结果进行比较。没有一个_-BIN或_-BIN2排序与内存中的排序顺序匹配。@larry-您是如何在数据库中生成字符串的?就像卡斯特。。。。。作为nvarcharN?我使用System.Data.SqlClient将字符串直接从我生成的排序列表中插入到C中的一个表中,并根据StringComparison.Ordinal进行了测试。@Larry-你能确认你使用的是Nchar/Nvarchar而不是char/varchar吗?可能您应该使用StringComparison.OrdinalIgnoreCase?