传递给LEFT或SUBSTRING函数的长度参数无效

时间:2012-10-23 20:48:08

标签: tsql

我有以下说明:'示例产品制造商产品名称XYZ - 尺寸',我想从此获得值'产品名称XYZ'。如果这只是一行我只是使用SUBSTRING没有问题,但我有数千条记录,虽然初始值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语句最后一行的值,但是当我尝试将其插入SUBSTRING函数时,我遇到了各种问题。

6 个答案:

答案 0 :(得分:20)

很可能你的行中缺少' - ',这会导致你的错误。 试试这个......

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

答案 1 :(得分:1)

您对[{1}}的第一次通话指定的长度为SUBSTRING

您可以尝试:

SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25))

答案 2 :(得分:1)

您也可以删除Sample Product Maker文字并从那里开始:

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

答案 3 :(得分:1)

问题是您对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

第三个参数必须评估为您想要的长度。也许你的意思是LEN(SUBSTRING(...))

答案 4 :(得分:0)

好像你想要这样的东西(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 

答案 5 :(得分:0)

你想:

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

请注意,一个好的做法是用charindex(...)包装patindex(...)nullif(...,0),然后根据需要处理null case(有时null是正确的结果,in在这种情况下,我们需要所有文本,以便我们isnull(...,8000)获得我们想要的长度。