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

SQL函数需求:移除字符串非数字字符并保留前导零

解决SQL函数保留前导零的问题

问题根源

你的ClearNonNumericCharacters函数本身是可以保留前导零的,测试结果丢失前导零是因为你把函数返回的字符串赋值给了INT类型变量@strTestNumeric——整数类型会自动忽略前导零,和函数无关。

直接执行函数就能看到它确实保留了前导零:

select dbo.ClearNonNumericCharacters('00098AB$709.89')

输出结果为:0009870989

修正测试代码

把存储结果的变量改为字符串类型即可:

declare @strTest VARCHAR(15) = null
declare @strTestNumeric NVARCHAR(MAX) = null -- 改为字符串类型,匹配函数返回值类型

select @strTest = '00098AB$709.89'
select @strTestNumeric = dbo.[ClearNonNumericCharacters](@strTest)

select @strTestNumeric -- 输出:0009870989

优化函数性能(可选)

原函数用循环逐字符替换,处理长字符串时效率较低。可以改用以下两种写法提升性能:

版本1:基于集合的写法(适用于SQL Server 2017+)

alter function ClearNonNumericCharacters
    (@str nvarchar(max))
returns nvarchar(max)
as
begin
    declare @result nvarchar(max) = ''
    
    select @result += s.CharVal
    from (
        select substring(@str, n, 1) as CharVal
        from (select top (isnull(len(@str), 0)) row_number() over(order by (select null)) as n from sys.all_columns) t
    ) s
    where s.CharVal between '0' and '9'
    
    return @result
end

版本2:递归CTE写法(兼容SQL Server 2008+)

alter function ClearNonNumericCharacters
    (@str nvarchar(max))
returns nvarchar(max)
as
begin
    if @str is null or @str = '' return ''
    
    ;with CharProcessing as (
        select
            cast(case when substring(@str, 1, 1) between '0' and '9' then substring(@str, 1, 1) else '' end as nvarchar(max)) as CleanStr,
            1 as Position
        union all
        select
            CleanStr + case when substring(@str, Position + 1, 1) between '0' and '9' then substring(@str, Position + 1, 1) else '' end,
            Position + 1
        from CharProcessing
        where Position < len(@str)
    )
    select top 1 @str = CleanStr from CharProcessing order by Position desc
    
    return @str
end

内容的提问来源于stack exchange,提问作者CoolBreeze-Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:58:57