Giải pháp được liên kết là sử dụng một vòng lặp - nếu có thể - điều bạn nên tránh.
Giải pháp của tôi là hoàn toàn có thể nội dòng, thật dễ dàng để tạo một UDF (hoặc thậm chí có thể tốt hơn:TVF nội tuyến) từ điều này.
Ý tưởng:Tạo một tập hợp các số đang chạy (ở đây nó bị giới hạn với số lượng các đối tượng trong sys.objects, nhưng có rất nhiều ví dụ về cách tạo một số kiểm đếm nhanh chóng). Trong CTE thứ hai, các chuỗi được chia thành các ký tự đơn. Lựa chọn cuối cùng quay trở lại với chuỗi đã được làm sạch.
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
Kết quả
1 ËËËËeeeeËËËË eeee
2 ËaËËbËeeeeËËËcË abeeeec
Đây là một câu trả lời khác từ tôi nơi cách tiếp cận này được sử dụng để thay thế tất cả đặc biệt ký tự có an toàn ký tự để lấy chữ latin đơn giản