Si vous êtes assuré de n'utiliser que les 26 lettres de l'alphabet anglais américain (versions majuscules et minuscules), alors vous pouvez vous en sortir en utilisant LIKE
et / ou en PATINDEX
utilisant la notation de plage simple de [a-z]
(vous ne le feriez pas besoin d'utiliser un "Z" majuscule lors de l'utilisation d'un classement insensible à la casse).
Mais, si vous pouvez obtenir des caractères non trouvés dans l'en-US alphabet encore disponibles dans diverses pages de codes / classements pour les VARCHAR
données (par exemple Þ
= capitale latine « Thorn » = SELECT CHAR(0xDE)
), alors vous pourriez avoir besoin d'inclure ceux de la classe de caractères: [a-z0-9, Þ]
. Bien sûr, ce que ces caractères supplémentaires seraient sur une base par page de codes.
Sachez également que le type de classement (SQL Server vs Windows) et les paramètres de sensibilité (casse, accent, etc. sensible vs insensible) affecteront les caractères inclus dans une plage particulière. Par exemple, les classements SQL Server trient les lettres majuscules et minuscules dans l'ordre opposé aux classements Windows. Autrement dit, en supposant un classement sensible à la casse pour les deux types de classement, l'un fera l'affaire AaBb...
et l'autre le fera aAbB...
. L'effet sera celui a
qui sera dans la plage de l' A-Z
un, mais pas de l'autre. Et la plage de a-Z
ne correspondra à aucun caractère dans un classement binaire (l'un se terminant par _BIN
ou _BIN2
, mais n'utilisez pas _BIN
) étant donné que la valeur de A
est 65 eta
est 97, il s'agit donc d'une plage non valide de 97 à 65 ;-). Il y a beaucoup trop de variations pour donner des exemples ici, donc j'essaierai de publier une explication détaillée sur mon blog très bientôt (puis je mettrai à jour cela avec le lien). Cependant, si vous allez être strict en acceptant uniquement les caractères anglais américain (même si vous pouvez obtenir des lettres valides dans d'autres langues), votre meilleure option sera probablement d'utiliser le modèle et le classement suivants:
LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2
Maintenant, si vous prenez en charge des NVARCHAR
données et pouvez obtenir des caractères "word" dans différentes langues, alors T-SQL ne sera pas d'une grande utilité car il n'a aucun moyen réel de différencier ces choses. Dans ce cas, vous devez utiliser une expression régulière (RegEx) - en particulier la Replace
méthode / fonction - et celles-ci ne sont disponibles que via SQLCLR. Ce qui suit montre un exemple de remplacement de plusieurs caractères "spéciaux", tout en laissant toutes les lettres valides dans au moins une langue:
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);
Retour:
this is a TEST, to strip out ç ƒ special ij ೫ chars 舛 დ א B
L'expression RegEx signifie:
\W
= un "échappement" RegEx signifiant "tout caractère autre qu'un mot"
\p{Pc}
= une "catégorie" Unicode de "Ponctuation, connecteur" (nécessaire uniquement pour la correspondance car cette "catégorie" est spécifiquement exclue par l' \W
échappement)
-[,]
= soustraction de classe (ceci est nécessaire pour exclure les virgules de la correspondance comme "spéciale" car elles sont incluses dans l' \W
échappement)
Vous pouvez faire une mise à jour d'une table simplement en émettant:
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;
Veuillez noter que pour ces exemples, j'ai utilisé deux fonctions disponibles dans la bibliothèque Free version SQL # des fonctions SQLCLR, que j'ai créée (mais encore une fois, elles sont gratuites). Notez également que j'ai utilisé les versions "4k" qui sont plus rapides en raison de l'utilisation NVARCHAR(4000)
au lieu des NVARCHAR(MAX)
types de paramètres. Si vos données utilisent NVARCHAR(MAX)
, supprimez simplement le "4k" des noms de fonction.
Veuillez également consulter: