Каков наилучший способ проверить наличие в поле VARCHAR символов, отличных от Ascii?
CHAR(1)
через CHAR(31)
и CHAR(127)
через CHAR(255)
.
Я попытался использовать PATINDEX
и столкнулся со следующей проблемой.
Проверка нижнего диапазона работала правильно.
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0
Мои данные имели три записи с 0x1E и все три были возвращены.
Но когда я проверяю только верхний диапазон:
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0
Он возвращает близко ко всем записям в таблице (количество таблиц 170737 и число возвращенных 170735), и поскольку мои данные не имеют значений в этом диапазоне, я думаю, что они не должны были возвращать записи.
sql-server
sql-server-2008-r2
t-sql
Герхард Вайс
источник
источник
Ответы:
Диапазоны в синтаксисе шаблона используют правила сортировки вашего сопоставления.
Используйте двоичное условие сортировки, чтобы диапазон упорядочивался по коду символа.
(Я также изменил это,
LIKE
поскольку я нахожу это более очевидным, чемPATINDEX > 0
)источник
Если вы похожи на меня и устали годами искать этих персонажей в ужасных данных вашей компании, вы можете использовать эту функцию или переписать ее для своих собственных целей. Это по общему признанию многословно, но это дополнительный шаг идентификации специальных символов, если хотите - раскомментируйте строки 19 - 179, чтобы сделать это.
Если строка не содержит непечатаемых или расширенных значений ascii - она возвращает NULL.
И затем, назовите это как:
Пример вывода:
Или
источник