Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Loại bỏ các ký tự mở rộng ASCII 128 trở đi (SQL)

Giải pháp được liên kết là sử dụng một vòng lặp - nếu có thể - điều bạn nên tránh.

Giải pháp của tôi là hoàn toàn có thể nội dòng, thật dễ dàng để tạo một UDF (hoặc thậm chí có thể tốt hơn:TVF nội tuyến) từ điều này.

Ý tưởng:Tạo một tập hợp các số đang chạy (ở đây nó bị giới hạn với số lượng các đối tượng trong sys.objects, nhưng có rất nhiều ví dụ về cách tạo một số kiểm đếm nhanh chóng). Trong CTE thứ hai, các chuỗi được chia thành các ký tự đơn. Lựa chọn cuối cùng quay trở lại với chuỗi đã được làm sạch.

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

Kết quả

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

Đây là một câu trả lời khác từ tôi nơi cách tiếp cận này được sử dụng để thay thế tất cả đặc biệt ký tự có an toàn ký tự để lấy chữ latin đơn giản




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. bổ sung ngày tháng trong hàm sql

  2. Giao dịch Khung thực thể đang hoạt động lâu dài

  3. Lưu trữ nhiều giá trị bit trong một cột bảng duy nhất

  4. Có bất kỳ nhược điểm nào khi luôn sử dụng nvarchar (MAX) không?

  5. Làm cách nào để cập nhật một cột mới được thêm vào trong cùng một câu lệnh lô