1

我有一个标量值函数,它返回一个包含 ASCII 单位分隔符 Char(31) 的数据的 varchar。我将此结果用作 Order By 子句的一部分,并尝试按升序排序。

我的标量值函数返回如下结果(拼写出不可打印的字符以供参考)

  • 美国广播公司
  • ABC (CHAR(31)) 定义
  • ABC (CHAR(31)) DEF (CHAR(31)) HIJ

我希望当我通过升序排序时,结果如下:

  • 美国广播公司
  • ABCDEF
  • ABCDEFHIJ

相反,我看到的结果完全相反:

  • ABCDEFHIJ
  • ABCDEF
  • 美国广播公司

现在我相当肯定这与不可打印的字符有关,但我不知道为什么。知道为什么会这样吗?

谢谢

4

2 回答 2

5

排序顺序可能受您的COLLATION设置的影响。按照脚本,显式使用Latin1_General_CI_ASas collat​​ion 按您的预期对项目进行排序。

;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;
于 2012-06-19T18:52:44.907 回答
1

我可以在 SQL Server 2008 R2 中复制此行为,并将排序规则设置为SQL_Latin1_General_CP1_CI_AS.

如果您无法更改排序规则设置,请将字段设置为nvarchar而不是varchar。这为我解决了这个问题。

于 2012-06-19T18:56:27.010 回答