解决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
相关产品推荐
相关产品推荐

