sql >> Databasteknik >  >> RDS >> Sqlserver

Ta bort ASCII Extended Characters 128 och framåt (SQL)

Den länkade lösningen använder en loop som är - om möjligt - något du bör undvika.

Min lösning är helt inlineable, det är lätt att skapa en UDF (eller kanske ännu bättre:en inline TVF) från detta.

Idén:Skapa en uppsättning löpande siffror (här är det begränsat med antalet objekt i sys.objects, men det finns massor av exempel på hur man skapar en siffra i farten). I den andra CTE delas strängarna till enstaka tecken. Det sista valet kommer tillbaka med den rensade strängen.

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

Här är ett annat svar från mig där detta tillvägagångssätt används för att ersätta alla särskilda tecken med secure tecken för att få vanligt latin




  1. Få de tomma posterna med SQL

  2. Android SQLite-fel:variabelnummer måste vara mellan ?1 och ?999

  3. SQL-brandvägg på ett enkelt sätt med ClusterControl &ProxySQL

  4. com.mysql.jdbc.PacketTooBigException java