जुड़ा हुआ समाधान एक लूप का उपयोग कर रहा है - यदि संभव हो - कुछ ऐसा जो आपको टालना चाहिए।
मेरा समाधान पूरी तरह से इनलाइन करने योग्य है, इससे 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
यहां एक और जवाब है मुझ से जहां इस दृष्टिकोण का उपयोग सभी विशेष . को बदलने के लिए किया जाता है सुरक्षित . वाले वर्ण सादा लैटिन . पाने के लिए वर्ण