Si tiene la garantía de que solo usará las 26 letras del alfabeto inglés de EE. UU. (Tanto en mayúsculas como en minúsculas), entonces puede evitar el uso LIKE
y / o PATINDEX
la notación de rango simple de [a-z]
(no necesita usar una "Z" mayúscula cuando se usa una intercalación que no distingue entre mayúsculas y minúsculas).
Sin embargo, si usted puede obtener caracteres que no se encuentran en el es-alfabeto todavía disponible en diferentes páginas de códigos / intercalaciones de VARCHAR
datos (por ejemplo Þ
= capital de América "espina" = SELECT CHAR(0xDE)
), entonces puede que tenga que incluir los de la clase de caracteres: [a-z0-9, Þ]
. Por supuesto, cuáles serían esos caracteres adicionales es por página de código.
Además, tenga en cuenta que tanto el tipo de clasificación (SQL Server frente a Windows) como la configuración de sensibilidad (mayúsculas y minúsculas, acento, etc., sensibles frente a insensibles) afectarán qué caracteres se incluyen en un rango particular. Por ejemplo, las intercalaciones de SQL Server clasifican las letras mayúsculas y minúsculas en el orden opuesto a las intercalaciones de Windows. Es decir, suponiendo una intercalación entre mayúsculas y minúsculas para ambos tipos de colaciones, una servirá AaBb...
y la otra lo hará aAbB...
. El efecto será que a
estará dentro del rango de A-Z
uno de ellos, pero no del otro. Y el rango de a-Z
no coincidirá con ningún carácter en una intercalación binaria (uno que termine en uno _BIN
o _BIN2
, pero no use _BIN
) dado que el valor de A
es 65 ya
es 97, por lo tanto, es un rango no válido de 97 a 65 ;-). Hay demasiadas variaciones para dar ejemplos aquí, así que intentaré publicar una explicación detallada en mi blog pronto (y luego actualizaré esto con el enlace). Sin embargo, si va a ser estricto acerca de aceptar solo caracteres en inglés de EE. UU. (Incluso si puede obtener letras válidas de otros idiomas), entonces su mejor opción probablemente será usar el siguiente patrón y clasificación:
LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2
Ahora, si está respaldando NVARCHAR
datos y puede obtener caracteres de "palabras" de varios idiomas, entonces T-SQL no será de mucha ayuda ya que no tiene una forma real de diferenciar estas cosas. En este caso, debe usar una Expresión regular (RegEx), específicamente el Replace
método / función, y estos solo están disponibles a través de SQLCLR. A continuación se muestra un ejemplo de reemplazo de varios caracteres "especiales", pero dejando todas las letras válidas en al menos un idioma:
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);
Devoluciones:
this is a TEST, to strip out ç ƒ special ij ೫ chars 舛 დ א B
La expresión RegEx significa:
\W
= un "escape" RegEx que significa "cualquier carácter que no sea una palabra"
\p{Pc}
= una "categoría" Unicode de "Puntuación, conector" (esto es necesario para la coincidencia solo porque esta "categoría" está específicamente excluida por el \W
escape)
-[,]
= resta de clase (esto es necesario para excluir las comas de la coincidencia como "especiales" ya que están incluidas en el \W
escape)
Puede actualizar una tabla simplemente emitiendo:
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;
Tenga en cuenta que para estos ejemplos, utilicé dos funciones disponibles en la biblioteca de la versión gratuita SQL # de funciones SQLCLR, que creé (pero de nuevo, estas son gratuitas). También tenga en cuenta que usé las versiones "4k", que son más rápidas debido al uso en NVARCHAR(4000)
lugar de los NVARCHAR(MAX)
tipos de parámetros. Si sus datos están utilizando NVARCHAR(MAX)
, simplemente elimine el "4k" de los nombres de las funciones.
Por favor vea también: