Если вы гарантированно когда-либо будете использовать только 26 букв английского алфавита США (как в верхнем, так и в нижнем регистре), тогда, конечно, вы можете избежать использования LIKE
и / или PATINDEX
с помощью простого обозначения диапазона [a-z]
(вы не станете необходимо использовать прописные буквы "Z" при использовании сортировки без учета регистра).
Но, если вы можете получить символы , которые не нашли в ан-США алфавит еще доступны в различных кодовых страниц / Collations для VARCHAR
данных (например , Þ
= Latin капитал «Торн» = SELECT CHAR(0xDE)
), то вам , возможно , потребуется включить тех , кто в классе символов: [a-z0-9, Þ]
. Конечно, то, что эти дополнительные символы будут в зависимости от кодовой страницы.
Кроме того, имейте в виду, что как тип сопоставления (SQL Server против Windows), так и настройки чувствительности (регистр, акцент и т. Д., А не нечувствительный) влияют на то, какие символы включены в определенный диапазон. Например, сортировки SQL Server сортируют буквы в верхнем и нижнем регистре в порядке, обратном сортировке Windows. Это означает, что при условии сортировки с учетом регистра для обоих типов сопоставлений, один будет делать, AaBb...
а другой будет делать aAbB...
. Эффект будет таким, что a
будет в пределах диапазона A-Z
для одного из них, но не другого. И диапазон a-Z
не будет соответствовать никаким символам в двоичном сопоставлении (один из которых заканчивается на _BIN
или _BIN2
, но не используется _BIN
), учитывая, что значение A
равно 65 иa
равно 97, следовательно, это недопустимый диапазон от 97 до 65 ;-). Здесь слишком много вариантов, чтобы приводить примеры, поэтому я постараюсь опубликовать подробное объяснение в своем блоге в ближайшее время (а затем обновлю его со ссылкой на него). Однако, если вы собираетесь строго принимать только символы английского языка США (даже если вы можете получать действительные буквы с других языков), тогда лучше всего будет использовать следующий шаблон и параметры сортировки:
LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2
Теперь, если вы поддерживаете NVARCHAR
данные и можете получать символы «слова» из разных языков, тогда T-SQL не поможет, поскольку у него нет реального способа дифференцировать эти вещи. В этом случае вам следует использовать Регулярное выражение (RegEx) - в частности, Replace
метод / функцию - и они доступны только через SQLCLR. Ниже приведен пример замены нескольких «специальных» символов, но при этом все действительные буквы оставлены как минимум на одном языке:
DECLARE @Test NVARCHAR(500);
SET @Test = N'this$is%a<>TEST,;to}⌡↕strip╞╟╚══¶out_ç_ƒ▀ special-ij-೫-chars-舛-დ-א-B';
SELECT SQL#.RegEx_Replace4k(@Test, N'[\W\p{Pc}-[,]]', N' ', -1, 1, NULL);
Возвращает:
this is a TEST, to strip out ç ƒ special ij ೫ chars 舛 დ א B
Выражение RegEx означает:
\W
= А RegEx «побег» , что означает «любой нон -Word характер»
\p{Pc}
= Unicode "категория" из "Пунктуации, Соединитель" (это необходимо только для соответствия, потому что эта "категория" специально исключена \W
escape)
-[,]
= вычитание класса (это необходимо для исключения запятых из соответствия как «особенных», так как они включены в \W
escape)
Вы можете обновить таблицу, просто выполнив:
UPDATE tbl
SET tbl.field = SQL#.RegEx_Replace4k(tbl.field, N'[\W\p{Pc}-[,]]', N' ', -1, 1, NULL)
FROM tbl
WHERE SQL#.RegEx_IsMatch4k(tbl.field, N'[\W\p{Pc}-[,]]', 1, NULL) = 1;
Обратите внимание, что для этих примеров я использовал две функции, доступные в библиотеке SQL # версии Free # функций SQLCLR, которые я создал (но, опять же, они бесплатны). Также обратите внимание, что я использовал версии «4k», которые быстрее благодаря использованию NVARCHAR(4000)
вместо NVARCHAR(MAX)
типов параметров. Если ваши данные используются NVARCHAR(MAX)
, то просто удалите «4k» из имен функций.
Пожалуйста, смотрите также: