【发布时间】:2011-03-13 22:12:45
【问题描述】:
在 SQL Server 2008 中,我在订购 NVARCHAR 列时看到一些奇怪的行为;这里有几个快速用例来演示:
案例 1:对 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
假设我想使用标准 ORDER BY 子句对 NVARCHAR 字段进行排序(我无法更改数据库设计)(我使用的是 linq2nhib,这会阻止我在这里进行任何转换) - 我如何获得排序以所需的方式工作(首先显示具有前导非字母数字值的项目)?
我希望对此有某种数据库/服务器级别的排序规则设置...有什么想法吗?
【问题讨论】:
-
此处描述了该行为的原因。 support.microsoft.com/kb/322112我不确定是否有办法绕过它。使用二进制排序规则对您有用吗? social.msdn.microsoft.com/Forums/en/transactsql/thread/…
-
感谢您的评论,它准确地描述了我所看到的行为......现在我只需要一个解决方案!我不介意更改数据库上的排序规则设置,是否有一个可以产生我想要的结果(并且仍然允许 unicode 列等)?
-
您可以使用
ORDER BY t.Name COLLATE Latin1_General_BIN ASC,但这会将大小写名称分开。更多讨论在这里blogs.msdn.com/b/sqlprogrammability/archive/2006/04/07/… -
Martin,正如问题中提到的,我在 order by 中真的没有什么特别之处,因为我正在使用 NHibernate.Linq 来执行查询,我可以期望得到它是标准的 ORDER BY col 语句....
-
你知道,仅仅因为你对一些 qwueries 使用 ORM 并不意味着你不能让它执行一个 spred proc 或查询,如果你需要用更好、更复杂或比生成的 ORM 代码更高效的方式。如果某个工具不能满足您的需求,请停止使用该工具。
标签: sql tsql sql-server-2008