2012-06-19 43 views
1

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

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

  • ABC
  • ABC(CHAR(31))DEF
  • ABC(CHAR(31))DEF (CHAR(31))HIJ

我期望的是,当我通过上升的结果命令将执行以下操作:

  • ABC
  • ABCDEF
  • ABCDEFHIJ

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

  • ABCDEFHIJ
  • ABCDEF
  • ABC

现在我相当肯定,这与非打印字符有关,但我不知道为什么。任何想法,为什么是这种情况?

感谢

回答

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; 
+0

SQLCollat​​ion返回SQL_Latin1_General_CP1_CI_AS – tribus

+0

@tribus - 整理似乎确实似乎以另一种方式排列项目。您必须选择更改数据库排序规则设置,通过子句显式地将其他排序规则添加到您的排序中,或者如pete所述将列定义更改为NVARCHAR。 –

1

我能够复制在SQL Server 2008 R2此行为与整理设置为SQL_Latin1_General_CP1_CI_AS验证当前数据库排序规则设置。

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

+0

+1 - 确实如此。我必须说,这是一个惊喜,但它确实有道理。 –