我有一个标量值函数,它返回包含ASCII单元分隔符Char(31)的varchar数据。我将此结果用作Order By子句的一部分,并尝试按升序排序。
我的标量值函数返回如下结果(拼出不可打印的字符以供参考)
我希望当我按升序排序时,结果如下:
相反,我认为结果完全相反:
现在我相当肯定这与不可打印的角色有关,但我不确定为什么。知道为什么会这样吗?
由于
答案 0 :(得分:5)
排序顺序可能会受到COLLATION设置的影响。在脚本之后,明确使用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;
答案 1 :(得分:1)
我能够在SQL Server 2008 R2中复制此行为,并将排序规则设置为SQL_Latin1_General_CP1_CI_AS
。
如果您无法更改整理设置,请将字段设置为nvarchar
而不是varchar
。这解决了我的问题。