Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Supprimer les caractères étendus ASCII à partir de 128 (SQL)

La solution liée utilise une boucle qui est - si possible - quelque chose que vous devriez éviter.

Ma solution est complètement inlineable, il est facile de créer un UDF (ou peut-être mieux :un TVF en ligne) à partir de cela.

L'idée :créer un ensemble de nombres courants (ici, il est limité au nombre d'objets dans sys.objects, mais il existe des tonnes d'exemples sur la manière de créer un décompte de nombres à la volée). Dans le deuxième CTE, les chaînes sont divisées en caractères uniques. La sélection finale revient avec la chaîne nettoyée.

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

Le résultat

1   ËËËËeeeeËËËË    eeee
2   ËaËËbËeeeeËËËcË abeeeec

Voici une autre réponse de moi où cette approche est utilisée pour remplacer tous les spéciaux caractères avec sécurisé caractères pour obtenir du latin ordinaire