SQL 服务器:替换 VARCHAR(MAX) 字段中的 ASCII 字符列表

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

我有一个包含大约 400 万条记录的 table,我需要删除 VARCHAR(MAX) 列中以下 运行ge(s) 个 ASCII 字符的任何实例。

请注意以上代表每个字符的十进制标识符,实际要替换的 ASCII 字符可以对照 http://www.asciitable.com/ 进行交叉检查。

我尝试了以下方法,达到了预期的效果。

第一种方式:使用嵌套 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

更新SQL:

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

上述两种方法都很好,但似乎有点慢(大约需要 1.5 小时)。有没有办法在 SQL 服务器上加速它?我不想在应用程序层中进行替换,因为值已经以这种方式保存了。

另外,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 及更高版本。请按照此 Whosebug 讨论 LOB 数据类型和某些排序规则在旧 SQL Server 版本中与 REPLACE 函数一起使用时的问题。