SQL-从字符串中删除并选择非字母数字字符

SQL-从字符串中删除并选择非字母数字字符,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试清理公司数据库中的字符串(在我们进行更好的数据验证之前的早期)。但是,该函数不起作用。我发现它只是将“[”赋值给@Pattern字符串,但我不知道为什么 重新创建函数的代码(您需要在函数名之前添加DB前缀): 测试(您需要在函数名之前添加DB前缀): 结果: 'woqp ienv8 90()*&@ #$! skllj_asdf' 提前感谢您的帮助:)我注意到两件事。首先,@patindex应该有通配符。其次,您可能不想返回循环内部 您可以尝试这样的逻辑: SET @Patte

我正在尝试清理公司数据库中的字符串(在我们进行更好的数据验证之前的早期)。但是,该函数不起作用。我发现它只是将“[”赋值给@Pattern字符串,但我不知道为什么

重新创建函数的代码(您需要在函数名之前添加DB前缀):

测试(您需要在函数名之前添加DB前缀):

结果:

'woqp ienv8 90()*&@ #$! skllj_asdf'

提前感谢您的帮助:)

我注意到两件事。首先,
@patindex
应该有通配符。其次,您可能不想返回循环内部

您可以尝试这样的逻辑:

SET @Pattern = '%' + @Pattern + '%';
SET @BadIndex = PATINDEX(@Pattern, @Str); -- Find first bad character index

WHILE @BadIndex > 0
    SELECT @Str = STUFF(@Str, @BadIndex, 1, ' '), -- Swap bad char for a space
           @BadIndex = PATINDEX(@Pattern, @Str); -- Find next bad character index
END;

RETURN @Str;
编辑:

问题是您的
declare
语句。您已将模式声明为
char()
而不是
varchar()
。这意味着该模式在右侧用空格填充,并且该模式从不匹配

只要改变这个:

DECLARE @BadIndex SMALLINT, -- Index of bad character
        @Pattern CHAR(132)  -- Characters to look for (min length is # chars + 4 for %[]% enclosing)
致:


这次我对它进行了测试,它正常工作。

可能是因为它将CHR(00)C样式解释为“字符串的结尾”?请尝试仅删除第一个字符,并从CHR(1)开始.Char值0-31是控制代码,这意味着它们是不可打印的字符,用于控制打印机等外围设备。删除这些值后,您应该看到的不仅仅是初始值[”。至于你的实际问题,我不确定我是否明白了你的意思……你的输入和结果是完全相同的字符串。用你要替换的值创建一个表可能更容易。然后创建一个表值函数来替换给定的字符。然后你可以使用交叉应用程序,并清理代码中更易于维护的所有值。@JMK Th我们的目标是去掉记录中的所有无效值,只留下字母数字和一些其他字符(如电子邮件地址的@或.)。测试/结果字符串相同的原因是因为函数还不能工作:(我读了
patindex()
的行为就像默认情况下包含通配符一样,但我明确添加了它们以确保安全。我还将代码的底部更改为上面的部分,但结果保持不变。@zhespelt…测试
patindex()非常简单
带通配符和不带通配符。我通常会发现得到不同的结果。在其他数据库中,正则表达式通常不需要通配符。
SET @Pattern = '%' + @Pattern + '%';
SET @BadIndex = PATINDEX(@Pattern, @Str); -- Find first bad character index

WHILE @BadIndex > 0
    SELECT @Str = STUFF(@Str, @BadIndex, 1, ' '), -- Swap bad char for a space
           @BadIndex = PATINDEX(@Pattern, @Str); -- Find next bad character index
END;

RETURN @Str;
DECLARE @BadIndex SMALLINT, -- Index of bad character
        @Pattern CHAR(132)  -- Characters to look for (min length is # chars + 4 for %[]% enclosing)
DECLARE @BadIndex SMALLINT, -- Index of bad character
        @Pattern VARCHAR(8000)  -- Characters to look for (min length is # chars + 4 for %[]% enclosing)