如下存储过程 ,当执行时候,数据量只有几行的时候可以,几十行的时候就报错了,求高手指正,谢谢。
ALTER  PROCEDURE [dbo].[cpzaocx]
  @bs int
AS
BEGIN

 with ctetemp as
 (
 
select isnull(a.riqi,b.riqi) as riqi,isnull(jin,0) as jin,isnull(xiao,0) as xiao,
isnull(jin,0)-isnull(xiao,0) as cun
from 
(
select CONVERT(char(10),pickuptime ,121) as riqi,sum(shul) as jin
from fitjujube
group by CONVERT(char(10),pickuptime ,121) ) a
full join 
(select  CONVERT(char(10), fahuoriqi ,121) as riqi,
sum(b.shuliang) as xiao
from  dbo.orderform a left join dbo.orderformchanpin b
on a.orderbianhao=b.orderbianhao where a.fahuoriqi is not null
group by CONVERT(char(10), fahuoriqi ,121)
) b on a.riqi=b.riqi)   
--select * from ctetemp
, cte AS
 (
 SELECT ROW_NUMBER()OVER(ORDER BY riqi )id,riqi ,jin ,xiao ,jin-xiao AS cun
 FROM ctetemp  
 ),
 test  AS 
 (
   SELECT * FROM cte WHERE id=1
   UNION ALL 
   SELECT b.id,b.riqi,b.jin,b.xiao,a.cun+b.cun 
   FROM test a INNER JOIN cte b ON a.id+1=b.id
 )
  SELECT a.id as id,a.riqi as 日期,a.jin as 进,a.xiao as 销,a.cun as 存,b.notes as 备注 FROM test  a
 left join ( select CONVERT(char(10),riqi ,121) as riqi,notes,pingzhong from dbo.kucunnote b where b.leibie='成品' and (pingzhong='' or pingzhong is null)) b on a.riqi=b.riqi 
order by a.id descEND

解决方案 »

  1.   

    或者:服务器范围的默认值为 100。如果指定 0,则没有限制。每一个语句只能指定一个 MAXRECURSION 值使用类似的语句:USE AdventureWorks2008R2;
    GO
    --Creates an infinite loop
    WITH cte (EmployeeID, ManagerID, Title) as
    (
        SELECT EmployeeID, ManagerID, Title
        FROM dbo.MyEmployees
        WHERE ManagerID IS NOT NULL
      UNION ALL
        SELECT cte.EmployeeID, cte.ManagerID, cte.Title
        FROM cte 
        JOIN  dbo.MyEmployees AS e 
            ON cte.ManagerID = e.EmployeeID
    )
    --Uses MAXRECURSION to limit the recursive levels to 2
    SELECT EmployeeID, ManagerID, Title
    FROM cte
    OPTION (MAXRECURSION 2);
    GO
     
      

  2.   

    联机丛书说明:如果递归 CTE 组合不正确,可能会导致无限循环。例如,如果递归成员查询定义对父列和子列返回相同的值,则会造成无限循环。可以使用 MAXRECURSION 提示以及在 INSERT、UPDATE、MERGE、DELETE 或 SELECT 语句的 OPTION 子句中的一个 0 到 32,767 之间的值,来限制特定语句所允许的递归级数,以防止出现无限循环。这样就能够在解决产生循环的代码问题之前控制语句的执行。服务器范围的默认值为 100。如果指定 0,则没有限制。每一个语句只能指定一个 MAXRECURSION 值。但是按照我写了这么多的cte,个人觉得这个提示绝大部分情况下是你的逻辑不对,而不是循环次数的问题,你先检查一下
      

  3.   

    不出错的时候你对了数据正确没有?如果正确了,就用MAXRECURSION 来扩大一下
      

  4.   

    谢谢我知道了OPTION (MAXRECURSION 0);,,这句加上就可以了