Den sammenkædede løsning bruger en løkke, som - om muligt - er noget, du bør undgå.
Min løsning er fuldstændig inlinebar, det er nemt at oprette en UDF (eller måske endnu bedre:en inline TVF) ud fra dette.
Ideen:Opret et sæt løbende tal (her er det begrænset med antallet af objekter i sys.objects, men der er tonsvis af eksempler på, hvordan man laver en taloptælling i farten). I den anden CTE opdeles strengene til enkelte tegn. Det endelige valg kommer tilbage med den rensede streng.
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
Resultatet
1 ËËËËeeeeËËËË eeee
2 ËaËËbËeeeeËËËcË abeeeec
Her er et andet svar fra mig, hvor denne tilgang bruges til at erstatte alle særlige tegn med sikker tegn for at få almindelig latin