Die akzeptierte Antwort eine Schleife verwendet, die vermieden werden sollten ...
Meine Lösung ist vollständig inlineable, ist es einfach, eine UDF zu erstellen (oder vielleicht noch besser: eine Inline-TVF) von diesem.
Die Idee: Erstellen Sie eine Reihe von laufenden Nummern (hier ist es mit der Anzahl der Objekte in sys.objects begrenzt, aber es gibt Tonnen von Beispiel, wie man eine Zahl tally im laufenden Betrieb erstellen). Im zweiten CTE sind die Strings in einzelne Zeichen aufgeteilt. Die letzte Auswahl kommt mit der gesäuberten 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
Here is another answer von mir, wo dieser Ansatz verwendet wird, alle Sonder Zeichen mit sicheren Zeichen Ebene lateinisch
diese http://stackoverflow.com/questions/983291/purpose-of-x20-x7e-in-regular-expressions helfen kann –
abhängig, welche Datenbankversion Sie sind. –
Ich bin nicht sicher, warum Sie nicht in der Präsentationsschicht vermeiden (Ich bin sicher, Sie haben einen guten Grund), aber mit Regular Expression können Sie dies am Eingangspunkt inline 'RegEx.Replace (sVar," [^ A -Za-z0-9 \ s] [\ x00- \ xFF] "," ")' ref: http://www.stylusstudio.com/SSDN/default.asp?action=9&read=1968&fid=23 –