Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Hapus ASCII Extended Characters 128 dan seterusnya (SQL)

Solusi tertaut menggunakan loop yang - jika mungkin - sesuatu yang harus Anda hindari.

Solusi saya benar-benar inlineable, mudah untuk membuat UDF (atau mungkin lebih baik:TVF inline) dari ini.

Idenya:Buat satu set angka berjalan (di sini dibatasi dengan jumlah objek di sys.objects, tetapi ada banyak contoh cara membuat penghitungan angka dengan cepat). Dalam CTE kedua, string dipecah menjadi karakter tunggal. Pilihan terakhir kembali dengan string yang dibersihkan.

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

Hasilnya

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

Ini jawaban lain dari saya di mana pendekatan ini digunakan untuk menggantikan semua khusus karakter dengan aman karakter untuk mendapatkan latin biasa




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sisipan massal lambat untuk tabel dengan banyak indeks

  2. nodejs mssql masukkan dengan parameter

  3. CEILING() Contoh di SQL Server

  4. Dapatkan catatan 30 hari terakhir dari tanggal hari ini di SQL Server

  5. Tipe data untuk menyimpan alamat ip di SQL Server