Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Remover caracteres estendidos ASCII 128 em diante (SQL)


A solução vinculada está usando um loop que é - se possível - algo que você deve evitar.

Minha solução é completamente inlineável, é fácil criar um UDF (ou talvez ainda melhor:um TVF inline) a partir disso.

A ideia:criar um conjunto de números em execução (aqui é limitado com a contagem de objetos em sys.objects, mas há muitos exemplos de como criar uma contagem de números em tempo real). No segundo CTE, as strings são divididas em caracteres únicos. A seleção final volta com a string limpa.
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

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

Aqui está outra resposta de mim onde esta abordagem é usada para substituir todos os especiais caracteres com seguro caracteres para obter latim simples