Разрешено ли использование CHAR (14) в диапазоне значений индекса T-SQL для SQL Server? - PullRequest
1 голос
/ 20 января 2012

В чем проблема с CHAR (13) или, возможно, CHAR (14) в TSQL patindex? Как только я включаю 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

1 Ответ

6 голосов
/ 20 января 2012

Это разрешено.

Следует иметь в виду, что диапазоны основаны на порядке сортировки, а не на символьных кодах, поэтому, возможно, в вашей сортировке по умолчанию она сортируется в позиции, которую вы не ожидаете.

Какое сопоставление по умолчанию для вашей базы данных?

Что возвращает следующее:

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

Возвращает 4 и во втором запросе.

...