繁体   English   中英

SQL Server中存储的proc递归

[英]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种不同的方法来完成您正在尝试的操作。

  1. 递归CTE方法
  2. 黑盒XML方法
  3. 使用公共语言运行时。
  4. 带递归的标量UDF
  5. 表值UDF与WHILE循环。
  6. 动态SQL
  7. Cursor的方法。

http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/#_Toc205129484

我认为你得到一个错误,因为每个递归调用可能使用相同的游标名称,并且嵌套调用在父调用关闭游标之前无法打开相同名称的游标。 如果可能,您可以将游标名称设置为动态,也可以像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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM