Wenn Sie garantiert immer nur die 26 Buchstaben des englischen US-Alphabets (sowohl Groß- als auch Kleinbuchstaben) verwenden, können Sie sicher mit der Verwendung LIKE
und / oder PATINDEX
der einfachen Bereichsnotation von [a-z]
(Sie würden es nicht tun) davonkommen müssen ein Großbuchstaben "Z" verwenden, wenn eine Sortierung ohne Berücksichtigung der Groß- / Kleinschreibung verwendet wird).
Wenn Sie jedoch möglicherweise Zeichen erhalten, die noch nicht im US-Alphabet enthalten sind und noch in verschiedenen Codepages / Kollatierungen für VARCHAR
Daten verfügbar sind (z. B. Þ
= lateinisches Großbuchstaben "Thorn" = SELECT CHAR(0xDE)
), müssen Sie diese möglicherweise in die Zeichenklasse aufnehmen : [a-z0-9, Þ]
. Diese zusätzlichen Zeichen werden natürlich pro Codepage verwendet.
Beachten Sie außerdem, dass sowohl die Einstellungen für den Sortierungstyp (SQL Server vs Windows) als auch die Empfindlichkeitseinstellungen (Groß- und Kleinschreibung, Akzent usw., sensitiv oder unempfindlich) Einfluss darauf haben, welche Zeichen in einem bestimmten Bereich enthalten sind. Beispielsweise sortieren die SQL Server-Kollatierungen Groß- und Kleinbuchstaben in der entgegengesetzten Reihenfolge wie die Windows-Kollatierungen. Das heißt, unter der Annahme einer Sortierung, bei der zwischen Groß- und Kleinschreibung unterschieden wird, reicht eine AaBb...
und die andere aus aAbB...
. Der Effekt wird sein, dass er für einen von ihnen a
im Bereich von liegt, A-Z
für den anderen jedoch nicht. Und der Bereich von a-Z
stimmt nicht mit Zeichen in einer binären Kollatierung überein (eines endet entweder mit _BIN
oder _BIN2
, wird aber nicht verwendet _BIN
), vorausgesetzt, der Wert von A
ist 65 unda
ist 97, daher ist es ein ungültiger Bereich von 97 bis 65 ;-). Es gibt viel zu viele Variationen, um hier Beispiele zu nennen, daher werde ich versuchen, bald eine ausführliche Erklärung in meinem Blog zu veröffentlichen (und diese dann mit dem Link dazu aktualisieren). Wenn Sie jedoch strengstens nur US-englische Zeichen akzeptieren (auch wenn Sie möglicherweise gültige Buchstaben aus anderen Sprachen erhalten), ist es wahrscheinlich die beste Option, das folgende Muster und die folgende Sortierung zu verwenden:
LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2
Wenn Sie NVARCHAR
Daten unterstützen und "Wort" -Zeichen aus verschiedenen Sprachen erhalten können, ist T-SQL keine große Hilfe, da es keine wirkliche Möglichkeit gibt, diese Dinge zu unterscheiden. In diesem Fall sollten Sie einen regulären Ausdruck (RegEx) verwenden - insbesondere die Replace
Methode / Funktion - und diese sind nur über SQLCLR verfügbar. Das Folgende zeigt ein Beispiel für das Ersetzen mehrerer "Sonderzeichen", wobei jedoch alle gültigen Buchstaben in mindestens einer Sprache verbleiben:
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);
Kehrt zurück:
this is a TEST, to strip out ç ƒ special ij ೫ chars 舛 დ א B
Der RegEx-Ausdruck bedeutet:
\W
= ein RegEx "Escape", was "ein beliebiges Nicht- Wort-Zeichen" bedeutet
\p{Pc}
= eine Unicode "Kategorie" von "Interpunktion, Konnektor" (dies wird nur für die Übereinstimmung benötigt, da diese "Kategorie" durch das \W
Escape ausdrücklich ausgeschlossen wird )
-[,]
= Klassensubtraktion (dies wird benötigt, um Kommas vom Abgleich als "speziell" auszuschließen, da sie im \W
Escape enthalten sind)
Sie können eine Tabelle einfach aktualisieren, indem Sie Folgendes ausgeben:
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;
Bitte beachten Sie, dass ich für diese Beispiele zwei Funktionen verwendet habe, die in der kostenlosen SQL # -Bibliothek der SQLCLR-Funktionen verfügbar sind, die ich erstellt habe (aber auch diese sind kostenlos). Beachten Sie auch, dass ich die "4k" -Versionen verwendet habe, die aufgrund der Verwendung NVARCHAR(4000)
anstelle von NVARCHAR(MAX)
Parametertypen schneller sind . Wenn Ihre Daten verwendet werden NVARCHAR(MAX)
, entfernen Sie einfach die "4k" aus den Funktionsnamen.
Bitte beachten Sie auch: