La soluzione collegata utilizza un ciclo che è, se possibile, qualcosa che dovresti evitare.
La mia soluzione è completamente inlineable, è facile creare un UDF (o forse anche meglio:un inline TVF) da questo.
L'idea:creare un set di numeri correnti (qui è limitato al conteggio degli oggetti in sys.objects, ma ci sono moltissimi esempi su come creare un conteggio di numeri al volo). Nel secondo CTE le stringhe sono suddivise in singoli caratteri. La selezione finale ritorna con la stringa pulita.
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
Il risultato
1 ËËËËeeeeËËËË eeee
2 ËaËËbËeeeeËËËcË abeeeec
Ecco un'altra risposta da me dove questo approccio viene utilizzato per sostituire tutti gli speciali caratteri con sicuro caratteri per ottenere un latino semplice