Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Премахване на ASCII разширени знаци 128 нататък (SQL)

Свързаното решение използва цикъл, който е - ако е възможно - нещо, което трябва да избягвате.

Моето решение е напълно вградено, лесно е да се създаде UDF (или може би дори по-добре:вграден TVF) от това.

Идеята:Създайте набор от текущи числа (тук е ограничен с броя на обектите в sys.objects, но има тонове примери как да създадете броя на числата в движение). Във втория CTE низовете се разделят на единични знаци. Окончателният избор се връща с изчистения низ.

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

Резултатът

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

Ето още един отговор от мен, където този подход се използва за замяна на всички специални знаци с защитен знаци, за да получите обикновена латиница




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. След блокиране на една транзакция между версиите на SQL Server

  2. Като оператор в Entity Framework?

  3. Групово актуализиране на записи с SQL

  4. Какъв е добър начин да изрежете всички символи за интервал от низ в T-SQL без UDF и без CLR?

  5. В SQL, как можете да групирате по диапазони?