sql >> Database >  >> RDS >> Sqlserver

Verwijder ASCII Extended Characters vanaf 128 (SQL)

De gekoppelde oplossing gebruikt een lus die - indien mogelijk - iets is dat u moet vermijden.

Mijn oplossing is volledig inlineable, het is gemakkelijk om hier een UDF (of misschien nog beter:een inline TVF) van te maken.

Het idee:maak een reeks lopende getallen (hier is het beperkt tot het aantal objecten in sys.objects, maar er zijn talloze voorbeelden van hoe je on-the-fly een getallentelling kunt maken). In de tweede CTE worden de strings gesplitst in enkele karakters. De laatste selectie komt terug met de schoongemaakte snaar.

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

Het resultaat

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

Hier is nog een antwoord van mij waar deze aanpak wordt gebruikt om alle speciale . te vervangen tekens met secure tekens om gewoon latijn te krijgen




  1. Syntaxisfout aan het einde van invoer in PostgreSQL

  2. Hoe de OCT()-functie werkt in MySQL

  3. AUTONOMOUS_TRANSACTION

  4. Hoe rijen dynamisch naar kolommen te transponeren in MySQL