查询中的错误“传递给LEFT或SUBSTRING函数的长度参数无效”。

时间:2013-07-18 05:59:33

标签: sql-server tsql

enter image description here enter image description here以下查询中的Hello我遇到了“传递给LEFT或SUBSTRING函数的长度参数无效”的问题。你能否为我解决这个错误,以便我可以处理查询。

select
  substring(
    a.ProcessInstanceDescription, 
    charindex('http://', a.ProcessInstanceDescription ), 
    charindex('KeyInstr', a.ProcessInstanceDescription ) 
      - charindex('http://', a.ProcessInstanceDescription )), 
  c.StreamName AS Category,
  ProcessInstanceAppianID as jobId,
  a.ProcessInstanceName,
  a.ProcessInstanceTargetDate AS TargetDate,
  a.ProcessInstanceDescription as TaskDescription,
  b.Name as department,
  SUBSTRING(
    ProcessInstanceName, 
    NULLIF(
      PATINDEX('%[0-9][0-9][0-9][0-9][0-9]%',ProcessInstanceName),
      0),
    7) as code
from 
  InternalUseOnly..ProcessInstance a 
  join InternalUseOnly..Departments b 
    on b.KeyDepartment = a.KeyDepartmentEntered 
    AND b.updoperation < 2
  join InternalUseOnly..ProcessStream c 
    on c.KeyProcessStream = a.KeyProcessStream 
    and c.updoperation < 2
where 
  ProcessInstanceCompleted is null
  and a.KeyProcessStream in (330) 
  and a.updoperation < 2

我上面附有一张图片。我想从任务描述中仅获取URL。您能否更正此查询或给我一个确切的查询来执行相同的

1 个答案:

答案 0 :(得分:2)

SUBSTRING的长度参数始终为参数#3。 仅当此参数<0时,才会发生此错误。 这意味着您在首次出现SUBSTRING时遇到问题,特别是这个表达式:

charindex('KeyInstr', a.ProcessInstanceDescription ) 
  - charindex('http://', a.ProcessInstanceDescription )

可能您在KeyInstr字段中找不到ProcessInstanceDescription,这就是失败的原因。

如何防范此错误取决于您想要做什么。

修改

解决此问题的一种方法是检查您的令牌是否已被找到('KeyInstr')。如果没有,请将结果替换为所需的值,无论是0,-1,NULL还是其他需要发出意外情况的信号。

CASE 
  WHEN charindex('KeyInstr', a.ProcessInstanceDescription) != 0 THEN
    charindex('KeyInstr', a.ProcessInstanceDescription ) 
      - charindex('http://', a.ProcessInstanceDescription )
  ELSE 0 END

......或者在你的情况下最好做...

SELECT
  CASE 
    WHEN charindex('KeyInstr', a.ProcessInstanceDescription) != 0 THEN
      substring(
        a.ProcessInstanceDescription, 
        charindex('http://', a.ProcessInstanceDescription ), 
        charindex('KeyInstr', a.ProcessInstanceDescription ) 
          - charindex('http://', a.ProcessInstanceDescription ))
    ELSE 0 END, 
  ...