我有返回包含ASCII单元分隔符字符(31)的数据的一个varchar的标量值函数。 我使用这个结果作为订单的一部分By子句,并试图以升序进行排序。
我的标量值函数返回结果如下述(阐明了参考不可打印的字符)
- ABC
- ABC(CHAR(31))DEF
- ABC(CHAR(31))DEF(CHAR(31))HIJ
我希望,当我被上升的结果排序是以下几点:
而不是我看到的结果完全相反:
现在我相当肯定,这与非打印字符做的,但我不知道为什么。 任何想法,为什么是这样?
谢谢
该排序顺序可以通过你的影响整理设置。 下面的脚本,明确使用Latin1_General_CI_AS
作为整理顺序的项目,如你所期望的。
;WITH q (Col) AS (
SELECT 'ABC' UNION ALL
SELECT 'ABC' + CHAR(31) + 'DEF' UNION ALL
SELECT 'ABC' + CHAR(31) + 'DEF' + CHAR(31) + 'HIJ'
)
SELECT *
FROM q
ORDER BY
Col COLLATE Latin1_General_CI_AS
什么是您使用排序规则? 您可以验证当前的数据库排序规则设置与
SELECT DATABASEPROPERTYEX('master', 'Collation') SQLCollation;
我能够复制在SQL Server 2008 R2此行为与整理设置为SQL_Latin1_General_CP1_CI_AS
。
如果你不能改变你的排序规则设置,设置现场nvarchar
,而不是varchar
。 这解决了这个问题对我来说。