リンクされたソリューションは、ループを使用しています。これは、可能であれば、避けるべきものです。
私のソリューションは完全にインライン化可能であり、これからUDF(またはさらに良い:インラインTVF)を作成するのは簡単です。
アイデア:一連の実行中の数値を作成します(ここでは、sys.objects内のオブジェクトの数によって制限されますが、その場で数値を集計する方法の例はたくさんあります)。 2番目のCTEでは、文字列は1文字に分割されます。最終的な選択は、クリーンな文字列で返されます。
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
別の回答があります このアプローチがすべての特別なを置き換えるために使用される私から 安全なの文字 プレーンラテン語を取得する文字