Якщо ви гарантовано будете використовувати лише 26 літер англійського алфавіту США (як великі, так і малі версії), то впевнені, що ви можете піти з використанням LIKE
та / або PATINDEX
з простою позначенням діапазону [a-z]
(ви б не стали потрібно використовувати верхній регістр "Z" при використанні нечутливого до регістру Collation).
Але, якщо ви можете отримати символи , які не знайшли в ан-США алфавіт ще доступні в різних кодових сторінок / Collations для VARCHAR
даних (наприклад , Þ
= Latin капітал «Торн» = SELECT CHAR(0xDE)
), то вам , можливо , буде потрібно включити тих , хто в класі символів: [a-z0-9, Þ]
. Звичайно, що це зайві символи - це на основі кодової сторінки.
Також майте на увазі, що і тип Collation (SQL Server проти Windows), і налаштування чутливості (випадок, акцент тощо, чутливий та нечутливий) впливатимуть на те, які символи будуть включені до певного діапазону. Наприклад, зібрання SQL Server сортують великі і малі літери у зворотному порядку, як і Windows Collations. Тобто, якщо припустити, що залежно від регістру зіставлення для обох типів збірок, один зробить, 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
дані і можете отримати символи "word" з різних мов, 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, що означає «будь- який символ, який не є словом»
\p{Pc}
= "Unicode" категорія "пунктуації, з'єднувач" (це потрібно для відповідності лише тому, що ця "категорія" спеціально виключається під час \W
втечі)
-[,]
= віднімання класу (це потрібно для виключення коми з відповідності як "спеціальних", оскільки вони включені у \W
вихідний)
Можна оновити таблицю, просто видавши:
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 # для безкоштовної версії функцій SQLCLR, які я створив (але знову ж таки, це безкоштовно). Також зауважте, що я використовував "4k" версії, які швидше завдяки використанню NVARCHAR(4000)
замість NVARCHAR(MAX)
типів параметрів. Якщо ваші дані використовуються NVARCHAR(MAX)
, то просто видаліть "4k" з назв функцій.
Також дивіться: