2012-11-27 73 views
1

我在我的sql表格中有特殊字符,并且想要删除特殊字符。从数据中删除特殊/不可打印字符

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

fn_RemoveBadXMLChars(data) 

这确实是这样的:

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

有没有删除所有特殊字符,而不是有100取代statments任何更简单的方法?

+2

任何特定的DBMS(MySQL,Postgres,SQL Server ...)? – PinnyM

+0

我正在使用MS SQL 2008 – Arcadian

+0

@ magic-c0d3r - 你有没有解决这个问题? – LittleBobbyTables

回答

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

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

这消除了一切,但字符,数字和“@”。