1

TSQL patindexのCHAR(13)またはおそらくCHAR(14)の問題は何ですか?パターンにCHAR(14)を含めるとすぐに、レコードが見つかりません。答えを探していると、2009年から自分の質問(未回答)が見つかりました(ここ:http ://www.sqlservercentral.com/Forums/Topic795063-338-1.aspx )。

これが私が何を意味するかを示すための別の簡単なテストです:

/* 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

4

1 に答える 1

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)

私にとっては

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

したがって、文字9と13はどちらも1〜31の範囲外です。したがって、

'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)

42番目のクエリでも返されます。

于 2012-01-20T13:55:56.887 に答える