1

ASCIIユニットセパレーターChar(31)を含むデータのvarcharを返すスカラー値関数があります。この結果をOrderBy句の一部として使用し、昇順で並べ替えようとしています。

私のスカラー値関数は、次のような結果を返します(参照用にスペルアウトされた印刷不可能な文字)

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

昇順で注文すると、結果は次のようになると思います。

  • ABC
  • ABCDEF
  • ABCDEFHIJ

代わりに、私は結果を完全に反対として見ています:

  • ABCDEFHIJ
  • ABCDEF
  • ABC

これは印刷できない文字に関係していると今ではかなり確信していますが、理由はわかりません。なぜそうなるのかについて何か考えはありますか?

ありがとう

4

2 に答える 2

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

照合をに設定して、SQL Server2008R2でこの動作を複製することができますSQL_Latin1_General_CP1_CI_AS

照合設定を変更できない場合は、フィールドをnvarcharの代わりにに設定してくださいvarchar。これで問題は解決しました。

于 2012-06-19T18:56:27.010 に答える