检查下数据表的数据特别是:dbo.wlsfhz表的“商品代码”字段,有没有记录的“商品代码”为空格或者特别短,这些记录在有其他条件的时候不会被计算,但是当没有条件的时候在计算 LEFT(dbo.wlsfhz.商品代码, CHARINDEX(''.'', 
      dbo.wlsfhz.商品代码, '+cast(@begindex as varchar(10))+') - 1) 
的时候出错。猜一下,反正你一个多月没解决了,试一下无妨。

解决方案 »

  1.   

    感谢老大的鼎力支持,我仔细检查了一下,商品代码这个字段没有为空或者是特别短的,我看了一下,一般情况下如此样式"01.007.01.03.01.006"引号内的,最短的样式也是"03.171.01.06";
    看这个表的时侯,想起领导讲过要实现能够查询到六级代码,即begindex这个字段的值最大应该到19才对(按LEFT(dbo.wlsfhz.商品代码, CHARINDEX(''.'', 
          dbo.wlsfhz.商品代码, '+cast(@begindex as varchar(10))+') - 1)这个写法),以前没注意,现在才发现试了一下,才发现如果在查询分析器中调试存储过程,输入begindex为19,则会提示"服务器: 消息 536,级别 16,状态 3,行 1
    向 substring 函数传递了无效的 length 参数。"
    所以我认为可能还是写法有问题,但是问题在哪里,我又不清楚了!
      

  2.   

    begindex的值在12以下没问题,12以后就不行了,13-19都不行,提示都是"级别 16,状态 3,行 1
    向 substring 函数传递了无效的 length 参数。"
    "
      

  3.   

    如果最短03.171.01.06,这个串长度12,最后的.的位置10,应该输入10以上都是有问题的。这样改下:ON LEFT(dbo.wlsfhz.商品代码, CHARINDEX(''.'', 
          dbo.wlsfhz.商品代码, '+cast(@begindex as varchar(10))+') - 1) = AIS20050616112908J.dbo.t_Item.FNumber AND 
          AIS20050616112908J.dbo.t_Item.FItemClassID = 2001-->
    ON AIS20050616112908J.dbo.t_Item.FItemClassID = 2001 and 
    case when len(dbo.wlsfhz.商品代码)<='+cast(@begindex as varchar(10))+' then ''''
        when len(dbo.wlsfhz.商品代码)>'+cast(@begindex as varchar(10))+' and CHARINDEX(''.'', 
          dbo.wlsfhz.商品代码, '+cast(@begindex as varchar(10))+')>0 then
    LEFT(dbo.wlsfhz.商品代码, CHARINDEX(''.'', 
          dbo.wlsfhz.商品代码, '+cast(@begindex as varchar(10))+') - 1) 
    else ''''
    end= AIS20050616112908J.dbo.t_Item.FNumber --试下,有点乱,可能写错了
      

  4.   

    将字符或二进制表达式(char、nchar、nvarchar、varchar、binary 或 varbinary)转换为不同数据类型的表达式时,数据可能会被截断,只显示一部分,或者因为结果太短无法显示而返回错误。除下表中所显示的转换外,转换为 char、varchar、nchar、nvarchar、binary 和 varbinary 时将被截断。被转换的数据类型 转换为的数据类型 结果 
    int、smallint 或 tinyint char * 
      varchar * 
      nchar E 
      nvarchar E 
    money、smallmoney、numeric、decimal、float 或 real char E 
      varchar E 
      nchar E 
      nvarchar E 
    * 结果长度太短而无法显示。
    E 因为结果长度太短无法显示而返回错误。