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

解决SQL中SUBSTRING函数传入无效长度参数的报错问题

解决SUBSTRING函数参数无效的问题

报错原因是当LongName中不包含(或prior to时,CHARINDEX返回0,导致SUBSTRING的长度参数计算为负数或无效值,触发Msg 537错误。以下是几种可行的解决方式:

方法一:用CASE语句处理有效/无效行

通过判断字符串中是否同时存在(和prior to,且prior to在(之后,再执行截取逻辑,否则返回自定义默认值:

SELECT 
    myValue = CASE
        WHEN CHARINDEX('(', p.LongName) > 0 
             AND CHARINDEX('prior to', p.LongName) > CHARINDEX('(', p.LongName) + 1
        THEN LTRIM(RTRIM(SUBSTRING(p.LongName, CHARINDEX('(', p.LongName) + 1, 
                        CHARINDEX('prior to', p.LongName) - CHARINDEX('(', p.LongName) - 1)))
        ELSE NULL -- 可替换为''、'无历史组织名称'等自定义内容
    END
FROM 
    tblPeople p (NOLOCK)

方法二:过滤无效行后查询

如果只需要提取包含有效格式的行,可以直接在WHERE子句中添加条件,排除不符合格式的数据:

SELECT 
    myValue = LTRIM(RTRIM(SUBSTRING(p.LongName, CHARINDEX('(', p.LongName) + 1, 
                    CHARINDEX('prior to', p.LongName) - CHARINDEX('(', p.LongName) - 1)))
FROM 
    tblPeople p (NOLOCK)
WHERE 
    CHARINDEX('(', p.LongName) > 0 
    AND CHARINDEX('prior to', p.LongName) > CHARINDEX('(', p.LongName) + 1

方法三:用NULLIF/ISNULL处理索引值

通过将无效的索引结果转为NULL,再替换为安全值,避免长度参数为负:

SELECT 
    myValue = LTRIM(RTRIM(SUBSTRING(p.LongName, 
                        ISNULL(CHARINDEX('(', p.LongName) + 1, 1), 
                        ISNULL(CHARINDEX('prior to', p.LongName) - CHARINDEX('(', p.LongName) - 1, 0))))
FROM 
    tblPeople p (NOLOCK)

这种方式下,无效行的myValue会返回空字符串,适合需要保留所有行但无效数据显示为空的场景。

内容的提问来源于stack exchange,提问作者Joe Bloggr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:32:44