1

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

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

fn_RemoveBadXMLChars(data) 

它做这样的事情:

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

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

4

3 回答 3

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
于 2012-11-27T20:21:34.817 回答
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
于 2012-11-27T20:34:31.993 回答
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]'

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

于 2013-07-31T15:45:23.997 回答