sql >> Databáze >  >> RDS >> Sqlserver

Odebrat ASCII Extended Characters 128 a novější (SQL)

Propojené řešení používá smyčku, což je - pokud je to možné - něco, čemu byste se měli vyhnout.

Moje řešení je zcela inline, je snadné z toho vytvořit UDF (nebo možná ještě lépe:inline TVF).

Myšlenka:Vytvořte sadu průběžných čísel (zde je to omezeno počtem objektů v sys.objects, ale existuje spousta příkladů, jak vytvořit součet čísel za běhu). Ve druhém CTE jsou řetězce rozděleny na jednotlivé znaky. Poslední výběr se vrátí s vyčištěným řetězcem.

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

Výsledek

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

Zde je další odpověď ode mě, kde se tento přístup používá k nahrazení všech speciálních znaky s zabezpečeným znaky, abyste získali prostou latinku




  1. funkce date_trunc s vědomím časového pásma

  2. Nastavení výchozího veřejného profilu pro databázovou poštu (SSMS)

  3. Výběr toho, kde více podmínek odpovídá SafeMysql

  4. seskupení archivu podle roku a měsíce pomocí php a mysql