SQL Server 2008 - VARCHAR与NVARCHAR值的不同排序顺序

时间:2010-07-09 14:45:44

标签: sql tsql sql-server-2008

在SQL Server 2008中,我在订购NVARCHAR列时看到了一些奇怪的行为;这里有一些快速用例来演示:

案例1:VARCHAR值的ORDER:

SELECT t.Name
FROM
( 
SELECT CAST('A' AS VARCHAR(500))  As Name
UNION SELECT CAST('-A' AS VARCHAR(500))  AS NAME
) As t
ORDER BY t.Name ASC

产生(我想要的)输出:

-A

(首先显示带有前导短划线的那个)

将此与NVARCHAR值的ORDER对比:

SELECT t.Name
FROM
( 
SELECT CAST('A' AS NVARCHAR(500))  As Name
UNION SELECT CAST('-A' AS NVARCHAR(500))  AS NAME
) As t
ORDER BY t.Name ASC

产生此输出:

一个
-A

假设我想使用标准的ORDER BY子句(我使用linq2nhib,这阻止我在这里进行任何转换)对NVARCHAR字段(我无法更改数据库设计)进行排序 - 如何进行排序以所需的方式工作(首先显示具有前导非字母数字值的项目?)

我希望有任何类型的数据库/服务器级排序规则设置......任何想法?

3 个答案:

答案 0 :(得分:1)

更改数据库中的排序规则或更改表中需要一致排序的各列的排序规则。

排序规则Latin1_General_BIN or Latin1_General_BIN2适用于您的示例。

答案 1 :(得分:1)

您需要使用二进制排序规则来实现一致的排序。

ORDER BY t.Name ASC COLLATE Latin1_General_BIN

修改 由于您无法在查询中进行整理, 你需要在数据库级别进行。

您需要在要比较的列上设置它,它需要是二进制的。

Here就是一个例子。

答案 2 :(得分:0)

您还可以在返回主键的CTE上使用CAST(VARCHAR)对该集进行排序,并在表上执行连接以获取NVARCHAR值。