bağlantılı bir çözümdür bir döngü kullanıyor.
Çözümüm tamamen çizilemez, bundan bir UDF (veya daha da iyisi: bir satır içi TVF) oluşturmak kolaydır.
Fikir: Bir dizi çalışan sayı yaratın (burada sys.objects'deki nesnelerin sayısıyla sınırlıdır, ancak örnekte tonlarca numara oluşturma yöntemi vardır). İkinci CTE'de dizeler tek karakterlere bölünür. Son seçim temizlenmiş dize ile geri geliyor.
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
bu yaklaşım güvenli karakterlerle tüm özel karakterleri değiştirmek için kullanılır
benden
1 ËËËËeeeeËËËË eeee
2 ËaËËbËeeeeËËËcË abeeeec
Here is another answerdüz latin
almak için sonuç bu sana olacak mı tetikleme kodunun bir parçası mı? Gelecekte bu değerleri önlemek için? – jarlh
Bağlantılı cevabı kullanın, 'IF UNICODE (@nchar)' ile 32 ile 255 'arasında' IF UNICODE (@nchar) <128 'değerini değiştirin –
Değerler bir sütunda veya bir işlev ya da Güncelleme ifadesi yapacak? – SkipFeeney