Wie kann am besten überprüft werden, ob ein VARCHAR-Feld Nicht-ASCII-Zeichen enthält?
CHAR(1)
durch CHAR(31)
und CHAR(127)
durch CHAR(255)
.
Ich habe versucht mit PATINDEX
und bin auf folgendes Problem gestoßen.
Die Überprüfung des unteren Bereichs hat ordnungsgemäß funktioniert.
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0
Meine Daten hatten drei Datensätze mit 0x1E und alle drei wurden zurückgegeben.
Aber wenn ich nur den oberen Bereich überprüfe:
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0
Es gibt fast alle Datensätze in der Tabelle zurück (Tabellenzahl 170737 und zurückgegebene Anzahl 170735), und da meine Daten keine Werte in diesem Bereich hatten, würde ich denken, dass es keine Datensätze hätte zurückgeben sollen.
sql-server
sql-server-2008-r2
t-sql
Gerhard Weiss
quelle
quelle
Antworten:
Bereiche in der Mustersyntax verwenden die Sortierregeln Ihrer Sortierung.
Verwenden Sie eine binäre Kollatierungsklausel, damit der Bereich nach Zeichencode sortiert wird.
(Ich habe es auch geändert,
LIKE
da ich das offensichtlicher finde alsPATINDEX > 0
)quelle
Wenn Sie so sind wie ich und über die Jahre müde geworden sind, nach diesen Zeichen in den schrecklichen Daten Ihres Unternehmens zu suchen, können Sie diese Funktion verwenden oder für Ihren eigenen Zweck umschreiben. Es ist zugegebenermaßen wortreich, aber es ist ein zusätzlicher Schritt, Sonderzeichen zu identifizieren, wenn Sie dies möchten - entfernen Sie dazu die Kommentare in den Zeilen 19 - 179.
Wenn die Zeichenfolge keine nicht druckbaren oder erweiterten ASCII-Werte enthält, wird NULL zurückgegeben.
Und dann nenne es so:
Beispielausgabe:
Oder
quelle