sql >> Base de Datos >  >> RDS >> Sqlserver

Eliminar caracteres extendidos ASCII 128 en adelante (SQL)

La solución vinculada está utilizando un bucle que es, si es posible, algo que debe evitar.

Mi solución es completamente en línea, es fácil crear un UDF (o tal vez incluso mejor:un TVF en línea) a partir de esto.

La idea:crear un conjunto de números continuos (aquí está limitado con el conteo de objetos en sys.objects, pero hay muchos ejemplos de cómo crear un conteo de números sobre la marcha). En el segundo CTE, las cadenas se dividen en caracteres individuales. La selección final regresa con la cadena limpia.

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

El resultado

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

Aquí hay otra respuesta de mí donde se usa este enfoque para reemplazar todos los especiales caracteres con seguro caracteres para obtener latín simple