簡體   English   中英

SQL Server:替換VARCHAR(MAX)字段中的ASCII字符列表

[英]SQL Server: Replace a list of ASCII characters from a VARCHAR(MAX) field

我有一個包含約400萬條記錄的表,我需要在VARCHAR(MAX)列中的以下范圍內刪除所有ASCII字符實例。

  • 00-08
  • 11-12
  • 14-31
  • 127

請注意,以上代表每個字符的十進制標識符,可以根據http://www.asciitable.com/交叉檢查要替換的實際ASCII字符。

我嘗試了以下方法,並取得了預期的效果。

第一種方式:使用嵌套的REPLACE函數:

UPDATE [MyTable] 
SET replace_ascii_chars = REPLACE(REPLACE(replace_ascii_chars, char(0), '') 
,char(1), '')....

第二種方法:創建以下SQL函數並運行UPDATE語句:

CREATE FUNCTION [dbo].RemoveASCIICharactersInRange(@InputString VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
    IF @InputString IS NOT NULL
    BEGIN
      DECLARE @Counter INT, @TestString NVARCHAR(40)

      SET @TestString = '%[' + NCHAR(0) + NCHAR(1) + NCHAR(2) + NCHAR(3) + NCHAR(4) + NCHAR(5) + NCHAR(6) + NCHAR(7) + NCHAR(8) + NCHAR(11) + NCHAR(12) + NCHAR(14) + NCHAR(15) + NCHAR(16) + NCHAR(17) + NCHAR(18) + NCHAR(19) + NCHAR(20) + NCHAR(21) + NCHAR(22) + NCHAR(23) + NCHAR(24) + NCHAR(25) + NCHAR(26) + NCHAR(27) + NCHAR(28) + NCHAR(29) + NCHAR(30) + NCHAR(31) + NCHAR(127)+ ']%'

      SELECT @Counter = PATINDEX (@TestString, @InputString COLLATE Latin1_General_BIN)

      WHILE @Counter <> 0
      BEGIN
        SELECT @InputString = STUFF(@InputString, @Counter, 1, '')
        SELECT @Counter = PATINDEX (@TestString, @InputString COLLATE Latin1_General_BIN)
      END
    END
    RETURN(@InputString)
END

UPDATE SQL:

UPDATE [MyTable] 
SET replace_ascii_chars = [dbo].RemoveASCIICharactersInRange(replace_ascii_chars)

上述兩種方法都可以正常工作,但似乎有點慢(大約需要1.5個小時)。 有沒有辦法在SQL Server中加快速度? 我不想在應用程序層中進行替換,因為值已經以這種方式保存。

另外,不是所有的400萬條記錄都沒有這些字符,那么是否有加快速度的方法?

編輯:我在說WHERE子句花費更長的時間時是錯誤的(由於我之前使用where子句的方式,它變慢了)。 我已經按照@MWillemse的建議更新了where子句,它現在看來非常快。

根據@MWillemse的建議,我添加了WHERE子句后,查詢現在運行得更快。

UPDATE [MyTable] 
SET replace_ascii_chars = REPLACE(REPLACE(replace_ascii_chars, char(0), '') 
,char(1), '')....
WHERE replace_ascii_chars LIKE '%[' + CHAR(0) + CHAR(1) + CHAR(2) + CHAR(3) + CHAR(4) + CHAR(5) + CHAR(6) + CHAR(7) + CHAR(8) + CHAR(11) + CHAR(12) + CHAR(14) + CHAR(15) + CHAR(16) + CHAR(17) + CHAR(18) + CHAR(19) + CHAR(20) + CHAR(21) + CHAR(22) + CHAR(23) + CHAR(24) + CHAR(25) + CHAR(26) + CHAR(27) + CHAR(28) + CHAR(29) + CHAR(30) + CHAR(31) + CHAR(127)+ ']%'

謝謝@ MWillemse,@ jarlh,@ Balm提出的寶貴意見。

編輯:請注意,這僅適用於SQL SERVER 2012及更高版本。 請使用此stackoverflow 鏈接來討論在較早的SQL Server版本中與REPLACE函數一起使用時LOB數據類型和某些排序規則的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM