Solusi tertaut menggunakan loop yang - jika mungkin - sesuatu yang harus Anda hindari.
Solusi saya benar-benar inlineable, mudah untuk membuat UDF (atau mungkin lebih baik:TVF inline) dari ini.
Idenya:Buat satu set angka berjalan (di sini dibatasi dengan jumlah objek di sys.objects, tetapi ada banyak contoh cara membuat penghitungan angka dengan cepat). Dalam CTE kedua, string dipecah menjadi karakter tunggal. Pilihan terakhir kembali dengan string yang dibersihkan.
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
Hasilnya
1 ËËËËeeeeËËËË eeee
2 ËaËËbËeeeeËËËcË abeeeec
Ini jawaban lain dari saya di mana pendekatan ini digunakan untuk menggantikan semua khusus karakter dengan aman karakter untuk mendapatkan latin biasa