Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erweiterte ASCII-Zeichen ab 128 entfernen (SQL)

Die verlinkte Lösung verwendet eine Schleife, die Sie - wenn möglich - vermeiden sollten.

Meine Lösung ist vollständig inlinefähig, es ist einfach, daraus eine UDF (oder vielleicht noch besser:eine Inline-TVF) zu erstellen.

Die Idee:Erstellen Sie eine Reihe von laufenden Zahlen (hier ist es mit der Anzahl der Objekte in sys.objects begrenzt, aber es gibt unzählige Beispiele, wie Sie eine Zahlenliste im Handumdrehen erstellen können). Im zweiten CTE werden die Zeichenketten in einzelne Zeichen aufgeteilt. Die endgültige Auswahl kommt mit der gereinigten Zeichenfolge zurück.

DECLARE @tbl TABLE(ID INT IDENTITY, EvilString NVARCHAR(100));
INSERT INTO @tbl(EvilString) VALUES('ËËËËeeeeËËËË'),('ËaËËbËeeeeËËËcË');

WITH RunningNumbers AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nmbr
    FROM sys.objects
)
,SingleChars AS
(
    SELECT tbl.ID,rn.Nmbr,SUBSTRING(tbl.EvilString,rn.Nmbr,1) AS Chr
    FROM @tbl AS tbl
    CROSS APPLY (SELECT TOP(LEN(tbl.EvilString)) Nmbr FROM RunningNumbers) AS rn 
)
SELECT ID,EvilString
      ,(
        SELECT '' + Chr 
        FROM SingleChars AS sc
        WHERE sc.ID=tbl.ID AND ASCII(Chr)<128
        ORDER BY sc.Nmbr
        FOR XML PATH('')
      ) AS GoodString
FROM @tbl As tbl

Das Ergebnis

1   ËËËËeeeeËËËË    eeee
2   ËaËËbËeeeeËËËcË abeeeec

Hier ist eine weitere Antwort von mir, wo dieser Ansatz verwendet wird, um alle speziellen zu ersetzen Zeichen mit sicher Zeichen, um einfaches Latein zu erhalten