处理传递给LEFT或SUBSTRING函数的无效长度参数错误

时间:2019-04-09 07:38:14

标签: sql sql-server tsql substring

我有一个相当简单的查询,该查询使用Substring函数从描述中提取信息。但是,某些说明格式异常,从而导致错误

  

传递给LEFT或SUBSTRING函数的长度参数无效。

在Substring函数失败的情况下,我想返回整个描述。但是,在线搜索解决方案并没有帮助我。 TRY...CATCH构造似乎很有用,但在这种情况下我无法弄清楚如何使用它。

Select 
ST.Description
, SUBSTRING(ST.Description, PATINDEX('% ([0-9]% x %) -%', ST.Description) + 2, CHARINDEX('x', SUBSTRING(ST.Description, PATINDEX('% ([0-9]% x %) -%', ST.Description) + 2, 20))-2) AS SubTaskQTY

From astTaskSubTasks ST

Join astTasks T ON T.Id = ST.ParentId
Join astAssets A ON A.Id = T.AssetId

Where A.Code = '2016100011'

2 个答案:

答案 0 :(得分:2)

尝试一下:

condition && action()
if (condition) action()
                     ^^
"extra" characters __||

答案 1 :(得分:1)

尝试类似的方法,使您可以在尝试子字符串之前对其进行测试。

select 
  ST.[Description]
  , case when FirstIndex > 2 and SecondIndex > 0
    then SUBSTRING(ST.[Description], FirstIndex, SecondIndex) else ST.[Description] end AS SubTaskQTY
from (
  select [Description]--, ParentId
    , PATINDEX('% ([0-9]% x %) -%', [Description]) + 2 FirstIndex
    , CHARINDEX('x', SUBSTRING([Description], PATINDEX('% ([0-9]% x %) -%', [Description]) + 2, 20)) - 2 SecondIndex
  from astTaskSubTasks
) ST
join astTasks T ON T.Id = ST.ParentId
join astAssets A ON A.Id = T.AssetId
where A.Code = '2016100011'