2010-07-09 98 views
2

在SQL Server 2008中,我在订购NVARCHAR列时看到一些奇怪的行为;这里有几个简单的用例来证明:SQL Server 2008 - VARCHAR与NVARCHAR值上的不同排序顺序

案例一:订单在VARCHAR值:

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

假设我要作为排序依据NVARCHAR字段(我不能改变数据库设计),采用标准的ORDER BY子句(我正在使用linq2nhib,它阻止了我在这里进行任何投射) - 如何让排序以所需的方式工作(首先显示带有非字母数字值的项目)?

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

+3

这里描述了行为的原因。 http://support.microsoft.com/kb/322112我不确定是否有方法。将使用二进制排序规则为您工作? http://social.msdn.microsoft.com/Forums/en/transactsql/thread/a2785ed0-2355-43f3-bd8b-2200824e9c1f – 2010-07-09 14:50:36

+0

感谢您的评论,这正是描述我所看到的行为......现在我只是需要解决方案!我不介意更改数据库的排序规则设置,是否有一个会产生我想要的结果(并仍然允许使用unicode列等)? – DanP 2010-07-09 14:53:33

+0

你可以使用'ORDER BY t.Name COLLATE Latin1_General_Bin ASC',但是这会分离出小写和大写的名字。这里再讨论一些http://blogs.msdn.com/b/sqlprogrammability/archive/2006/04/07/570397。aspx – 2010-07-09 15:02:54

回答

1

要么更改数据库中的排序规则,要么更改表中各个列的排序规则,以便您需要一致的排序。

排序规则Latin1_General_BIN or Latin1_General_BIN2可以正常工作。

1

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

ORDER BY t.Name ASC COLLATE Latin1_General_BIN 

编辑: 因为你不能做整理查询, 则需要在数据库级别做。

您需要将其设置在您正在比较的列上,并且它需要是二进制的。

Here就是这样一个例子。

0

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