Свързаното решение използва цикъл, който е - ако е възможно - нещо, което трябва да избягвате.
Моето решение е напълно вградено, лесно е да се създаде UDF (или може би дори по-добре:вграден TVF) от това.
Идеята:Създайте набор от текущи числа (тук е ограничен с броя на обектите в sys.objects, но има тонове примери как да създадете броя на числата в движение). Във втория CTE низовете се разделят на единични знаци. Окончателният избор се връща с изчистения низ.
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
Резултатът
1 ËËËËeeeeËËËË eeee
2 ËaËËbËeeeeËËËcË abeeeec
Ето още един отговор от мен, където този подход се използва за замяна на всички специални знаци с защитен знаци, за да получите обикновена латиница