【问题标题】:Handle Invalid length parameter passed to the LEFT or SUBSTRING function Error处理传递给 LEFT 或 SUBSTRING 函数错误的无效长度参数
【发布时间】:2024-01-06 21:13:01
【问题描述】:

我有一个相当简单的查询,它使用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'

【问题讨论】:

标签: sql sql-server tsql substring


【解决方案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'

【讨论】:

  • 我不太关注这个查询,它也不起作用。同样的错误仍然存​​在,我认为这是因为第 6 行仍在尝试提取信息时无法提取信息
  • @TimStack 在工作时几乎与其他答案一样。需要一些样本数据来实际测试它。希望这个原理能告诉你如何让它发挥作用。
  • 我现在看到了你的错误。您正在检查>=2,它应该是>2。如果FirstIndex 为 2,则意味着 PATINDEX 没有返回任何内容,这等于错误。
  • 另外,请停止对我的帖子进行相当无用的编辑
  • 好点,我不记得它是基于 0 还是基于 1 的匹配。
【解决方案2】:

试试这个:

Select 
ST.Description
, CASE PATINDEX('% ([0-9]% x %) -%', ST.Description) 
        WHEN 0 THEN ST.Description
        ELSE SUBSTRING(ST.Description, PATINDEX('% ([0-9]% x %) -%', ST.Description) + 2, CHARINDEX('x', SUBSTRING(ST.Description, PATINDEX('% ([0-9]% x %) -%', ST.Description) + 2, 20))-2)
    END
 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'


SELECT  PATINDEX('% ([0-9]% x %) -%', '1 x -') 

【讨论】:

    最近更新 更多