查询语言是这样的:SELECT iAutoID,cPici,cPici2,cTaskName,cTaskMemo,cOperation,dJDtime,cGroup_Name,dRealTime,cUserIDname,cTaskStateName,cParaDefID,cTaskID,iTaskNo,iXdTime,ijdtime FROM vProTask  WHERE cGroupID IN (SELECT cGroup_id FROM v_UserInGroup WHERE cUserID='demo' )  AND cPlanID='SCJHD201001150001'
报的错误是:向 substring 函数传递了无效的 length 参数。
我的查询里并没有subString 函数啊?我查询,出错的行,是一个cGroupID=1的行,我想是不是我的SELECT cGroup_id FROM v_UserInGroup 结果集中有值11造成的呢,在没有cGroupID=1的查询中,是不报错的。
并且单独做条件:SELECT iAutoID,cPici,cPici2,cTaskName,cTaskMemo,cOperation,dJDtime,cGroup_Name,dRealTime,cUserIDname,cTaskStateName,cParaDefID,cTaskID,iTaskNo,iXdTime,ijdtime FROM vProTask  WHERE cGroupID IN (SELECT cGroup_id FROM v_UserInGroup WHERE cUserID='demo' ) 不报错。
单独做:SELECT iAutoID,cPici,cPici2,cTaskName,cTaskMemo,cOperation,dJDtime,cGroup_Name,dRealTime,cUserIDname,cTaskStateName,cParaDefID,cTaskID,iTaskNo,iXdTime,ijdtime FROM vProTask  WHERE  cPlanID='SCJHD201001150001'
也不报错。高手们,帮帮忙想个解决方法吧。

解决方案 »

  1.   

    SELECT 
    iAutoID,
    cPici,
    cPici2,
    cTaskName,
    cTaskMemo,
    cOperation,
    dJDtime,
    cGroup_Name,
    dRealTime,
    cUserIDname,
    cTaskStateName,
    cParaDefID,
    cTaskID,
    iTaskNo,
    iXdTime,
    ijdtime 
    FROM vProTask  V
    WHERE  EXISTS  
     (SELECT 1 FROM v_UserInGroup WHERE cGroupID=V.cGroup_id  AND  cUserID='demo' ) 
     AND cPlanID='SCJHD201001150001'改成这样试试,应该是你其它语句造成的
      

  2.   

    不太懂 试试join吧 效果一样的
    SELECT iAutoID,cPici,cPici2,cTaskName,cTaskMemo,cOperation,dJDtime,cGroup_Name,dRealTime,cUserIDname,cTaskStateName,cParaDefID,cTaskID,iTaskNo,iXdTime,ijdtime 
    FROM vProTask  v
    join  v_UserInGroup  u on v.cGroupID=u.cGroup_id
    and u.cUserID='demo'AND v.cPlanID='SCJHD201001150001'
      

  3.   

    报的错误是:向 substring 函数传递了无效的 length 参数。 
    我的查询里并没有subString 函数啊? 楼主仔细检查,应该不是这句报的错
      

  4.   

    你的这句里面没有substring函数啊
    是不是你其他的句子没有删除?
      

  5.   

    v_UserInGroup 是视图,看看代码 ?
      

  6.   

    石头大哥厉害,UP,查看下代码先SP_HELPTEXT v_UserInGroup
      

  7.   


    CREATE VIEW dbo.v_UserInGroup
    AS
    SELECT *
    FROM (SELECT a.cUser_ID, SUBSTRING(a.cGroup_Id, b.ID, CHARINDEX(',', 
                  a.cGroup_Id + ',', b.ID) - b.ID) AS cGroup_ID
            FROM dbo.tb_User a INNER JOIN
                  dbo.sys_Num b ON CHARINDEX(',', ',' + a.cGroup_Id, b.ID) = b.ID) 
          DERIVEDTBL
    WHERE (cGroup_ID <> '')GO
      

  8.   

    好了,就这里有问题了,
     CHARINDEX(',', 
                  a.cGroup_Id + ',', b.ID) - b.ID检查这个吧,
      

  9.   

    这个也挺难的,这两个表是:
    一个计划表视图 vProTask  里面有个字段是组编码内容是组id,数字的。如:1或2货3 单一的。
    另一个表是员工表,员工表有个字段是 权限组,内容是 组id的集合,如:1,2,3,4 多个用逗号分隔。刚才的查询是 查询demo这个员工,在vProTask中有权限的记录。
      

  10.   

    查这句的SQL语句:CHARINDEX(',', 
                  a.cGroup_Id + ',', b.ID) - b.ID)
    我决定肯定是这句引起的!
      

  11.   

    CREATE VIEW dbo.v_UserInGroup
    AS
    SELECT *
    FROM (SELECT a.cUser_ID, SUBSTRING(a.cGroup_Id, b.ID, CHARINDEX(',', 
                  a.cGroup_Id + ',', b.ID) - b.ID) AS cGroup_ID
            FROM dbo.tb_User a INNER JOIN
                  dbo.sys_Num b ON substring(','+a.cGroup_Id,b.ID,1)=',') 
          DERIVEDTBL
    WHERE (cGroup_ID <> '')
    改成这样
      

  12.   

    没看明白。
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  13.   

    暂时解决了,这么晚还能得到如此多高手帮助,非常感激!看来高手都是努力得到的。我把视图改成poofly的方式。但是现在测试环境变了,那个提示不出了。下次遇到再继续问,也可能是那一个批次有脏数据,总之搞不明白了。谢谢各位!