Недопустимый параметр length, переданный функции left или SUBSTRING

У меня есть следующее описание: "образец Product Maker Product Name XYZ - Size", и я хотел бы получить только значение "Product Name XYZ" из этого. Если бы это была только одна строка, у меня не было бы проблем с использованием подстроки, но у меня есть тысячи записей, и хотя начальное значение Sample Product Maker одинаково для всех продуктов, название продукта может быть другим, и я ничего не хочу после дефиса.

то, что я до сих пор создал ошибку в заголовке этот вопрос.

SELECT i.Itemid,
       RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 25, (SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)))))) AS ProductDescriptionAbbrev,
       CHARINDEX('-', i.ShortDescription, 0) - 25  as charindexpos
FROM t_items i

Я получаю "аргумент типа данных varchar недопустим для аргумента 3 функции подстроки"

Как вы можете видеть, я получаю значение для последней строки оператора sql, но когда я пытаюсь подключить его к функции подстроки, я получаю различные проблемы.

6 ответов


скорее всего, у вас есть строки, где отсутствует' -', что вызывает вашу ошибку. Попробовать это...

SELECT i.Itemid,
    SUBSTRING(i.ShortDescription, 22, CHARINDEX('-', i.ShortDescription+'-', 22)) AS ProductDescriptionAbbrev,
FROM t_items i

вы также можете вырезать Sample Product Maker текст и идти оттуда:

SELECT RTRIM(LEFT(
    LTRIM(REPLACE(i.ShortDescription, 'Sample Product Maker', '')),
        CHARINDEX('-', LTRIM(REPLACE(i.ShortDescription, 'Sample Product Maker', 
    '' ))) - 1))
AS ShortDescription

ваш первый звонок в SUBSTRING задает длину SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)).

вы можете попробовать:

declare @t_items as Table ( ItemId Int Identity, ShortDescription VarChar(100) )
insert into @t_items ( ShortDescription ) values
  ( 'Sample Product Maker Product Name XYZ - Size' )

declare @SkipLength as Int = Len( 'Sample Product Maker' )

select ItemId,
  RTrim( LTrim( Substring( ShortDescription, @SkipLength + 1, CharIndex( '-', ShortDescription, @SkipLength ) - @SkipLength - 1 ) ) ) as ProductDescriptionAbbrev
  from @t_items

проблема в том, что ваш внешний вызов SUBSTRING передается символьный тип данных из внутренней SUBSTRING вызов третьего параметра.

                                                  +--This call does not return an integer type
SELECT i.Itemid,                                  V
   RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 25, (SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)))))) AS ProductDescriptionAbbrev,
   CHARINDEX('-', i.ShortDescription, 0) - 25  as charindexpos
FROM t_items i

третий параметр должен оценивать длину, которую вы хотите. Возможно, вы имели в виду ... --3-->?


Похоже, вы хотите что-то вроде этого (22, а не 25):

SELECT i.Itemid, 
       RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 22, CHARINDEX('-', i.ShortDescription)-22))) AS ProductDescriptionAbbrev, 
       CHARINDEX('-', i.ShortDescription)-22 as charindexpos
FROM t_items i 

вы хотите:

LEFT(i.ShortDescription, isnull(nullif(CHARINDEX('-', i.ShortDescription),0) - 1, 8000))

обратите внимание, что хорошей практикой является обертывание charindex(...)и patindex(...)С nullif(...,0), а затем при желании обработайте нулевой случай (иногда null-правильный результат, в этом случае мы хотим весь текст, поэтому мы isnull(...,8000) для длины мы хотим).