语句被终止。完成执行语句前已用完最大递归 100。 警告: 聚合或其他 SET 操作消除

wanggenhu0 2013-04-02 02:01:47
如下存储过程 ,当执行时候,数据量只有几行的时候可以,几十行的时候就报错了,求高手指正,谢谢。
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 desc

END
...全文
2008 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanggenhu0 2013-04-02
  • 打赏
  • 举报
回复 1
谢谢我知道了OPTION (MAXRECURSION 0);,,这句加上就可以了
發糞塗牆 2013-04-02
  • 打赏
  • 举报
回复
引用 6 楼 wanggenhu0 的回复:
引用 4 楼 DBA_Huangzj 的回复: 引用 3 楼 wanggenhu0 的回复:引用 2 楼 DBA_Huangzj 的回复: 或者:服务器范围的默认值为 100。如果指定 0,则没有限制。每一个语句只能指定一个 MAXRECURSION 值使用类似的语句: SQL code?12345678910111213141516171819USE AdventureWorks200……
不出错的时候你对了数据正确没有?如果正确了,就用MAXRECURSION 来扩大一下
---涛声依旧--- 2013-04-02
  • 打赏
  • 举报
回复
没用过,学习
wanggenhu0 2013-04-02
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
引用 3 楼 wanggenhu0 的回复:引用 2 楼 DBA_Huangzj 的回复: 或者:服务器范围的默认值为 100。如果指定 0,则没有限制。每一个语句只能指定一个 MAXRECURSION 值使用类似的语句: SQL code?12345678910111213141516171819USE AdventureWorks2008R2;GO--Crea……
怎么修改呢我的逻辑应该没问题行数少就不出错,,
發糞塗牆 2013-04-02
  • 打赏
  • 举报
回复
联机丛书说明:如果递归 CTE 组合不正确,可能会导致无限循环。例如,如果递归成员查询定义对父列和子列返回相同的值,则会造成无限循环。可以使用 MAXRECURSION 提示以及在 INSERT、UPDATE、MERGE、DELETE 或 SELECT 语句的 OPTION 子句中的一个 0 到 32,767 之间的值,来限制特定语句所允许的递归级数,以防止出现无限循环。这样就能够在解决产生循环的代码问题之前控制语句的执行。服务器范围的默认值为 100。如果指定 0,则没有限制。每一个语句只能指定一个 MAXRECURSION 值。 但是按照我写了这么多的cte,个人觉得这个提示绝大部分情况下是你的逻辑不对,而不是循环次数的问题,你先检查一下
發糞塗牆 2013-04-02
  • 打赏
  • 举报
回复
引用 3 楼 wanggenhu0 的回复:
引用 2 楼 DBA_Huangzj 的回复: 或者:服务器范围的默认值为 100。如果指定 0,则没有限制。每一个语句只能指定一个 MAXRECURSION 值使用类似的语句: SQL code?12345678910111213141516171819USE AdventureWorks2008R2;GO--Creates an infinite loopWITH cte (Emplo……
这是服务器默认行为,可以修改的
wanggenhu0 2013-04-02
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
或者:服务器范围的默认值为 100。如果指定 0,则没有限制。每一个语句只能指定一个 MAXRECURSION 值使用类似的语句: SQL code?12345678910111213141516171819USE AdventureWorks2008R2;GO--Creates an infinite loopWITH cte (EmployeeID, Manag……
意思是行数超过一百就出错了吗
發糞塗牆 2013-04-02
  • 打赏
  • 举报
回复
或者:服务器范围的默认值为 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
發糞塗牆 2013-04-02
  • 打赏
  • 举报
回复
你的逻辑有问题

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧