Обработка параметра неверной длины, переданного в функцию LEFT или SUBSTRING. Ошибка - PullRequest
1 голос
/ 09 апреля 2019

У меня довольно простой запрос, который использует функцию Substring для извлечения информации из описания.Однако некоторые описания имеют исключительный формат, что приводит к ошибке

Недопустимый параметр длины, переданный в функцию LEFT или 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 ]

2 голосов
/ 09 апреля 2019

Попробуйте это:

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 -') 
1 голос
/ 09 апреля 2019

Попробуйте что-то вроде этого, что позволит вам проверить, что подстрока будет работать, прежде чем пытаться это сделать.

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...