You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server自定义Remove_Non_Alphanumeric函数过滤字符异常问题

问题排查与解决方法

核心问题根源

  • 编码隐式转换异常:你的函数输入参数和返回值都用了VARCHAR类型,仅支持单字节字符存储。如果传入的原始字符串包含Unicode字符(比如特殊项目符号、全角字符、小语种文字等),SQL Server会自动将无法匹配当前数据库排序规则对应代码页的Unicode字符转换为?,这就是返回结果中出现意料之外?的原因。部分项目符号刚好落在你当前代码页的单字节字符范围内,不会被转成?,同时你的允许字符集合没有排除这类符号,就会被保留下来。
  • 通配符规则编写错误:PATINDEX的[^]排除集合不需要额外加|作为字符分隔符,你写的|反而会被识别为允许保留的字符;另外连字符-放在集合中间会被识别为范围匹配符,而非普通的连字符,导致实际匹配逻辑和你预期不一致。

修复后的函数代码

ALTER FUNCTION [dbo].[Remove_Non_Alphanumeric]
    (@String_Parameter NVARCHAR(MAX)) 
RETURNS NVARCHAR(MAX)
AS
BEGIN
    -- 注意:[^]内直接列允许的字符,不需要分隔符,-放到最末尾避免被识别为范围符
    DECLARE @Allow_Characters NVARCHAR(500) = N'%[^A-Za-z0-9 ?,&/().' + NCHAR(13) + NCHAR(10) + N'()[]-]%';
 
    WHILE PATINDEX(@Allow_Characters, @String_Parameter) > 0
    BEGIN
        SELECT @String_Parameter = STUFF(@String_Parameter, PATINDEX(@Allow_Characters, @String_Parameter), 1, N'');
    END

    RETURN @String_Parameter;
END

验证调整建议

  • 如果需要额外过滤掉单字节项目符号,直接将对应符号从上面的允许字符集合中删除即可
  • 如果后续需要新增允许保留的特殊字符,直接追加到[^]的字符列表中即可,不需要加任何分隔符

内容的提问来源于stack exchange,提问作者Richard Housham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:39:05