2

我正在运行 SQL Server 2005 和 .Net 2.0。我有一些表需要在同一列中以多种语言存储数据。例如,带有 ArticleID(身份)和 ArticleName (nvarchar 100) 的 Article 表。 ArticleName 中的数据可能采用各种语言。

我的数据库使用 SQL_Latin1_General_CP1_CI_AS 的默认排序规则,因为我们的大部分数据都是英文的。

我的应用程序中的每个用户都可以选择他/她的首选文化。在用户界面中,文章数据显示在数据网格中,用户可以按 ArticleName 对它们进行排序。

现在,由于我的数据库整理,排序顺序不正确。我正在考虑通过使用 ORDER BY ... COLLATE 子句来解决这个问题。但是如何将正确的用户文化映射到 SQL Server 排序规则?我是否必须像这样指定每种文化 - 例如。如果culture = zh-CN(中国PRC),则使用排序规则Chinese_PRC_CI_AS 等等...

有没有更好的方法来获取排序规则?我的方法正确吗?或者有没有更好的方法来处理这个?(我确实想过在 .Net 中实际执行排序,但这似乎是在浪费 CPU 时间。)感谢阅读。

4

1 回答 1

2

SQL Server 2005 有一个 fn_helpcollat​​ions() 表函数,它返回所有支持的排序规则:

select *, 
COLLATIONPROPERTY(name, 'CodePage') as CodePage,
COLLATIONPROPERTY(name, 'LCID') as LCID,
COLLATIONPROPERTY(name, 'ComparisonStyle') as ComparisonStyle,
COLLATIONPROPERTY(name, 'Version') as Version
from fn_helpcollations()

这篇MSDN 文章详细处理了 SQL Server 排序规则并指出:

但是,由于 LCID 和排序规则之间没有直接映射,因此您无法从 LCID 确定正确的排序规则。

如果您希望能够根据用户的语言环境 ID 自动为用户分配最佳排序顺序,这很不方便。

我建议您构建一个自定义表,将 SQL 排序规则映射到您为用户支持的语言,从该映射表中检索用户的排序规则,并按照您的意图使用 ORDER BY COLLATE。

于 2009-07-18T10:19:52.700 回答