从数据中删除特殊/不可打印的字符

时间:2012-11-27 20:12:06

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

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

我有一个功能可以删除所有破坏XML的字符。

fn_RemoveBadXMLChars(data) 

这样做:

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

我喜欢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

答案 2 :(得分:1)

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

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]'

除去字符,数字和'@'之外的所有内容。