2012-01-20 7 views
1

TSQL patindexのCHAR(13)またはCHAR(14)の問題は何ですか? パターンにCHAR(14)を含めると、レコードが見つかりません。 回答を検索していますが、私は自分の質問を(回答していない)2009年から見つけました(ここではhttp://www.sqlservercentral.com/Forums/Topic795063-338-1.aspx)。結果 -SQL ServerのT-SQLのpatindexの範囲でCHAR(14)は使用できませんか?

/* PATINDEX TEST */ 
DECLARE @msg NVARCHAR(255) 
SET @msg = 'ABC' + NCHAR(13) + NCHAR(9) + 'DEF' 

DECLARE @unwanted NVARCHAR(50) 
-- unwanted chars in a "chopped up" string 
SET @unwanted = N'%[' + NCHAR(1) + '-' + NCHAR(13) + NCHAR(14) + '-' + NCHAR(31) + ']%' 
SELECT patindex(@unwanted, @msg) 

:4

-- NOW LET THE unwanted string includ the whole range from 1 to 31 


    SET @unwanted = '%['+NCHAR(1)+'-'+NCHAR(31)+']%' -- -- As soon as Char(14) is included, we get no match with patindex! 
    SELECT patindex(@unwanted, @msg) 

- 結果:それが許可されている0

答えて

6

は、ここで私が何を意味するか示すために別の簡単なテストです。

範囲は文字コードではなく照合ソート順に基づいていることに注意する必要がありますが、デフォルトの照合順序では期待しない位置に並べ替えることがあります。

データベースのデフォルトの照合は何ですか?

次の返品は何ですか?私にとって

;WITH CTE(N) AS 
(
SELECT 1 UNION ALL 
SELECT 9 UNION ALL 
SELECT 13 UNION ALL 
SELECT 14 UNION ALL 
SELECT 31 
) 
SELECT N 
FROM CTE 
ORDER BY NCHAR(N) 

それはそう両方の文字9および13は、1〜31の範囲外にある

N 
----------- 
1 
14 
31 
9 
13 

を返します。したがって、

'ABC' + NCHAR(13) + NCHAR(9) + 'DEF' NOT LIKE N'%['+NCHAR(1)+N'-'+NCHAR(31)+N']%' 

あなたの質問の結果を説明します。キャラクター14はそれに入りません。

バイナリコレート句を使用して、期待どおりに並べ替えることができます。例えば

SELECT patindex(@unwanted COLLATE Latin1_General_100_BIN, @msg) 

4も2番目のクエリに返します。

+0

私の照合順序はFinnish_Swedish_CI_ASであり、あなたのCTEは結果を同じ順序で返します。私は、32よりも低い文字が異なる順序であり、照合順序に依存する可能性があると想像していませんでした!ありがとうございました! –

+0

これを知ってよかったです。ありがとうございました。 – abhi

関連する問題