我的sql表中有特殊字符,想要删除特殊字符。
我有一个功能可以删除所有破坏XML的字符。
fn_RemoveBadXMLChars(data)
这样做:
REPLACE(@ResultVar,'ÿ','')
有没有更简单的方法来删除每个特殊字符而不是100个替换语句?
答案 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]'
除去字符,数字和'@'之外的所有内容。