【问题标题】:Remove special/unprintable char from data从数据中删除特殊/不可打印的字符
【发布时间】:2012-11-15 13:07:17
【问题描述】:

我的 sql 表中有特殊字符,想删除这些特殊字符。

我有一个函数可以去除所有破坏 XML 的字符。

fn_RemoveBadXMLChars(data) 

它做了这样的事情:

REPLACE(@ResultVar,'ÿ','')

有没有更简单的方法来删除每个特殊字符而不是有 100 个替换语句?

【问题讨论】:

  • 任何特定的 DBMS(MySQL、Postgres、SQL Server...)?
  • @magic-c0d3r - 你解决过这个问题吗?
  • 是的。我最终在我的 c# 代码中使用正则表达式来转义 XML 的字符。

标签: sql sql-server xml sql-server-2008 special-characters


【解决方案1】:

您可以创建一个过滤表,其中包含您要替换的每个值的记录,如下所示:

CREATE TABLE FilterTable (
    FilterCharacter nchar(1) primary key
)

INSERT INTO FilterTable SELECT 'ÿ'
INSERT INTO FilterTable SELECT 'o'

然后使用一个变量来替换您的过滤器表,如下所示:

DECLARE @ResultVar nvarchar(50)
SET @ResultVar = 'Bobbÿ'

SELECT @ResultVar = REPLACE(@ResultVar, FilterCharacter, '')
FROM FilterTable   

SELECT @ResultVar

【讨论】:

    【解决方案2】:

    我喜欢 LittleBobbyTables 的回答,但另一种方法是将您的函数代码更改为类似的内容

       declare @value as varchar(100) = ' 98;;445498ÿThis is test     ';
       declare @len as int = LEN(@value);
       declare @i as int = 1;
       declare @work as varchar(1);
       declare @retValue as varchar(max) = '';
       declare @asciiValue as int
    
       while @i <= @len begin
         set @i = @i + 1;
         set @work = SUBSTRING(@value,@i,1);
         set @asciiValue = ASCII(@work);    
         -- Allow space(32) though } (125)
         if (@asciiValue between 32 and 125) and @asciiValue not in (38) -- Exclude
           set @retValue = @retValue + @work;
      end
      print @retValue
    

    【讨论】:

      【解决方案3】:

      我结合了一些我找到的解决方案,最后我得到了这个结果:

      CREATE FUNCTION [dbo].[RemoveSpecialChars] (@Input VARCHAR(MAX))
      RETURNS VARCHAR(MAX)
      BEGIN
      DECLARE @Expression NVARCHAR(50) = '[^A-Za-z0-9]'
      DECLARE @pos INT = PATINDEX('%' + @Expression + '%', @Input)
      
      WHILE @Pos > 0
      BEGIN
          SET @Input = STUFF(@Input, @pos, 1, '')
          SET @Pos = PATINDEX('%' + @Expression + '%', @Input)
      END
      RETURN @Input
      END
      

      您可以通过修改@Expression 来定义要保留的字符。 如果你想保留所有字符和数字加上'@'你会改变

      DECLARE @Expression NVARCHAR(50) = '[^A-Za-z0-9]'
      

      DECLARE @Expression NVARCHAR(50) = '[^@A-Za-z0-9]'
      

      这会删除除字符、数字和“@”之外的所有内容。

      【讨论】:

        最近更新 更多