Недопустимый параметр 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)
для длины мы хотим).