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

Fjern ASCII Extended Characters 128 og frem (SQL)

Den sammenkædede løsning bruger en løkke, som - om muligt - er noget, du bør undgå.

Min løsning er fuldstændig inlinebar, det er nemt at oprette en UDF (eller måske endnu bedre:en inline TVF) ud fra dette.

Ideen:Opret et sæt løbende tal (her er det begrænset med antallet af objekter i sys.objects, men der er tonsvis af eksempler på, hvordan man laver en taloptælling i farten). I den anden CTE opdeles strengene til enkelte tegn. Det endelige valg kommer tilbage med den rensede streng.

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

Resultatet

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

Her er et andet svar fra mig, hvor denne tilgang bruges til at erstatte alle særlige tegn med sikker tegn for at få almindelig latin




  1. Hvorfor er innodbs VIS TABEL STATUS så upålidelig?

  2. PHP SQL-forespørgselsresultater

  3. Hvad er Oracle Session?

  4. Tilføjelse af 'seriel' til eksisterende kolonne i Postgres