代码之家  ›  专栏  ›  技术社区  ›  chuck taylor

sqlserver中的存储过程递归

  •  1
  • chuck taylor  · 技术社区  · 16 年前

    不幸的是,SQLServer没有这一点,并且给了我一个错误,既不能声明已经存在的游标,也不能嵌套和插入exec语句。

    这种计算本质上是递归的,所以据我所知,没有任何方法可以通过连接来避免这种情况。

    编辑:澄清实际的计算,因为代码是复杂的其他东西,可能会使事情复杂化-

    表A中的objType告诉您表A中的objID是containerID(同样在表A中)还是表B中的and itemID。

    5 回复  |  直到 16 年前
        1
  •  3
  •   KM.    16 年前

    您提供的信息很少,因此这里有一个猜测:请尝试使用 Recursive Queries Using Common Table Expressions ,请尝试基于集合的操作而不是游标,或者尝试使用动态SQL。

        2
  •  1
  •   Conrad Frix    16 年前

    这篇文章给出了7种不同的方法来做你想做的事情。

    1. 递归CTE方法
    2. 使用公共语言运行库。
    3. 带递归的标量自定义项
    4. 动态结构化查询语言
    5. 光标接近。

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

        3
  •  0
  •   FrustratedWithFormsDesigner    16 年前

    我认为您会遇到一个错误,因为每个递归调用可能都使用相同的游标名称,而嵌套调用在父调用关闭游标之前无法打开相同名称的游标。如果可能的话,你能让光标的名字动态化吗 SOME_CURSOR_{$RECURSION_DEPTH}

    不确定下一个/insert exec问题,尽管它可能与游标有关。

        4
  •  0
  •   tQuarella    16 年前

    用本地作用域声明游标可以解决这个问题。尽管我不确定游标在递归上下文中的行为。

    http://msdn.microsoft.com/en-us/library/ms189238.aspx

        5
  •  0
  •   Fandango68    9 年前
    DECLARE StudentdIDCursor CURSOR LOCAL FOR SELECT ...blahblah
    

    关键是 LOCAL 期限。它每次都会在幕后生成一个单独的游标定义。