Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Rimuovere i caratteri estesi ASCII da 128 in poi (SQL)

La soluzione collegata utilizza un ciclo che è, se possibile, qualcosa che dovresti evitare.

La mia soluzione è completamente inlineable, è facile creare un UDF (o forse anche meglio:un inline TVF) da questo.

L'idea:creare un set di numeri correnti (qui è limitato al conteggio degli oggetti in sys.objects, ma ci sono moltissimi esempi su come creare un conteggio di numeri al volo). Nel secondo CTE le stringhe sono suddivise in singoli caratteri. La selezione finale ritorna con la stringa pulita.

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

Il risultato

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

Ecco un'altra risposta da me dove questo approccio viene utilizzato per sostituire tutti gli speciali caratteri con sicuro caratteri per ottenere un latino semplice