在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,它阻止了我在这里进行任何投射) - 如何让排序以所需的方式工作(首先显示带有非字母数字值的项目)?
我希望有某种数据库/服务器级别的排序规则设置...任何想法?
这里描述了行为的原因。 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
感谢您的评论,这正是描述我所看到的行为......现在我只是需要解决方案!我不介意更改数据库的排序规则设置,是否有一个会产生我想要的结果(并仍然允许使用unicode列等)? – DanP 2010-07-09 14:53:33
你可以使用'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