传递给SUBSTRING的长度参数无效(使用charindex时 - 仅用于某些char)

时间:2018-04-18 10:34:00

标签: sql-server database

我有一个数据库,其中大多数testid在括号中都有我要提取的信息。所以我写了(简化版)

select 
case when wt.testid like '%(%)%' 
then substring(wt.testid, 
        charindex('(',wt.testid)+1, 
        (charindex(')',wt.testid) - charindex('(',wt.testid) - 1)
        )

工作得很好,但并非所有这些测试都有这种格式,有些在下划线之后和空格之前有这些信息,

所以我添加了这个额外的部分

else substring(wt.testid, 
        charindex('_',wt.testid)+1, 
        (charindex(' ',wt.testid) - charindex('_',wt.testid) -1)
        ) 

但由于某种原因,这会导致“传递给SUBSTRING函数的长度参数无效。”

如果我删除-1然后查询工作,这表明-1导致长度参数为负,但查询的所有结果都有一个空格和一个下划线,当我传递时

(charindex(' ',wt.testid) - charindex('_',wt.testid) -1)

进入我的选择我总是得到正值,所以我不知道发生了什么。

1 个答案:

答案 0 :(得分:1)

即使您的过滤器意味着结果集中只返回包含括号或下划线和空格格式的结果,SQL Server也 保证不会急切地评估某些表达式并生成错误实际上没有对最终结果做出贡献的行。

您可以通常通过明智地使用CASE表达式重新测试您认为已知的事实来解决这个问题:

select 
case when wt.testid like '%(%)%' 
then substring(wt.testid, 
        charindex('(',wt.testid)+1, 
        (charindex(')',wt.testid) - charindex('(',wt.testid) - 1)
        )
when wt.testid like '%!_% %' escape '!'
then substring(wt.testid, 
        charindex('_',wt.testid)+1, 
        (charindex(' ',wt.testid) - charindex('_',wt.testid) -1)
        )
end

如果您想分享MS似乎无意解决此问题的绝望,请参阅SQL Server should not raise illogical errors