[英]stored proc recursion in SQL Server
我有一种情况,我希望有一个存储过程返回一个表,它作为计算的一部分递归调用自己。
不幸的是SQL Server没有这个,并且给我一个错误,就是无法声明已经存在的游标以及无法嵌套和插入exec语句。
我可以通过使用函数解决其中一些问题吗? 还有另一种更好的方法吗?
计算本质上是递归的,所以就我所知,没有任何使用连接的解决方法。
编辑:澄清实际计算,因为代码因其他东西而变得复杂,并可能使问题复杂化 -
假设表A有列(containerID,objID,objType,weight),表B有列(itemID,value)。
表A中的objType告诉您表A中的objID是否为containerID(再次在表A中),或者是表B中的itemID和itemID。
(containerID,objID)是表A上的主键,表B上是itemID。
通常,容器中将包含数十到数百个物品或其他容器。 希望递归深度不超过十几个级别。 (猜测)计算是得到加权平均值。
您提供的信息非常少,因此可以猜测:尝试使用递归查询使用公用表表达式 ,尝试基于集合的操作而不是游标,或尝试使用动态SQL。
本文提供了7种不同的方法来完成您正在尝试的操作。
我认为你得到一个错误,因为每个递归调用可能使用相同的游标名称,并且嵌套调用在父调用关闭游标之前无法打开相同名称的游标。 如果可能,您可以将游标名称设置为动态,也可以像SOME_CURSOR_{$RECURSION_DEPTH}
那样简单, SOME_CURSOR_{$RECURSION_DEPTH}
您可能必须将递归深度作为参数添加到过程中。 我从来没有在SQL Server中做过这样的事情,所以我不是百分百肯定。
不确定下一个/插入exec问题,尽管它可能与光标绑定。
使用LOCAL范围声明游标可以解决问题。 虽然我不确定游标如何在递归上下文中起作用。
看看这篇文章: http : //msdn.microsoft.com/en-us/library/ms189238.aspx
DECLARE StudentdIDCursor CURSOR LOCAL FOR SELECT ...blahblah
关键是LOCAL
术语。 它每次都会在幕后生成一个单独的游标定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.