Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中的存储过程递归_Sql_Sql Server_Stored Procedures_Function_Recursion - Fatal编程技术网

SQL Server中的存储过程递归

SQL Server中的存储过程递归,sql,sql-server,stored-procedures,function,recursion,Sql,Sql Server,Stored Procedures,Function,Recursion,在这种情况下,我希望一个存储过程返回一个表,该表作为计算的一部分递归调用自己 不幸的是,SQL Server没有这些功能,并且给了我一个错误,既不能声明已经存在的游标,也不能嵌套和插入exec语句 我可以通过使用函数来解决这些问题吗?还有其他更好的方法吗 这种计算本质上是递归的,所以据我所知,使用连接无法避免这种情况 编辑:澄清实际的计算,因为代码被其他东西复杂化了,可能会使事情复杂化- 假设表A有列(containerID、objID、objType、weight),表B有列(itemID、v

在这种情况下,我希望一个存储过程返回一个表,该表作为计算的一部分递归调用自己

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

我可以通过使用函数来解决这些问题吗?还有其他更好的方法吗

这种计算本质上是递归的,所以据我所知,使用连接无法避免这种情况

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

假设表A有列(containerID、objID、objType、weight),表B有列(itemID、value)

表A中的objType告诉您表A中的objID是集装箱ID(同样在表A中)还是表B中的and itemID

(containerID,objID)是表a上的主键,表B上的itemID也是主键


一般来说,一个容器中会有几十到几百个物品或其他容器。希望递归深度不会超过12个级别。(猜测)计算是为了得到一个加权平均值。

我认为您会得到一个错误,因为每个递归调用可能使用相同的游标名称,并且嵌套调用在父调用关闭游标之前无法打开相同名称的游标。如果可能的话,可以将游标名称设置为动态的,可能是像
SOME\u cursor\uu DEPTH}
这样简单的,但是您可能需要将递归深度作为参数添加到过程中。不过,我在SQLServer中从未做过类似的事情,所以我不能100%确定


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

我认为您会遇到一个错误,因为每个递归调用可能使用相同的游标名称,并且嵌套调用在父调用关闭游标之前无法打开相同名称的游标。如果可能的话,可以将游标名称设置为动态的,可能是像
SOME\u cursor\uu DEPTH}
这样简单的,但是您可能需要将递归深度作为参数添加到过程中。不过,我在SQLServer中从未做过类似的事情,所以我不能100%确定


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

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


查看本文:

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


查看本文:

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

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

本文提供了7种不同的方法来完成您想要做的事情

  • 递归CTE方法
  • blackbox XML方法
  • 使用公共语言运行库
  • 带递归的标量UDF
  • 带有WHILE循环的表值UDF
  • 动态SQL
  • 光标接近

  • 本文提供了7种不同的方法来完成您想要做的事情

  • 递归CTE方法
  • blackbox XML方法
  • 使用公共语言运行库
  • 带递归的标量UDF
  • 带有WHILE循环的表值UDF
  • 动态SQL
  • 光标接近
  • 关键是
    本地
    术语。它每次都会在幕后生成一个单独的光标定义


    关键是
    本地
    术语。它每次都会在幕后生成一个单独的光标定义。

    我想了解更多有关计算的信息。。。函数无疑会起到一定作用,但你会惊讶地发现,你可以用子查询和视图做一些疯狂的事情。我喜欢游标,但它们经常被恶意攻击……你能提供更多的信息吗?特别是关于递归存储过程的性质。这是SQL Server吗?如果您使用的是SQL 2008,则可以使用递归CTE来完成大多数任务,而无需使用游标。一个代码示例如何,这样我们就可以看到您正在尝试做什么?假设您有一个充满某种记录的表。然后你有一个表格,里面有成对的(容器、记录、重量)或(容器、容器、重量)组合,说明每个容器中有什么。如果要对第二个表中容器中的记录进行加权平均,则(容器,容器)对需要在此处进行一些递归。如果有帮助的话,想象一下容器是股票指数,记录是股票。在一个过程中可能实际上不需要递归(或者根本不需要)。如果您发布了一个DDL并对该计算进行了更好的描述,那么我们可能会提出一个查询,可能是非递归的。首先,您是否研究过在查询中进行计算的聚合函数?我想了解有关计算的更多信息。。。函数无疑会起到一定作用,但你会惊讶地发现,你可以用子查询和视图做一些疯狂的事情。我喜欢游标,但它们经常被恶意攻击……你能提供更多的信息吗?特别是关于递归存储过程的性质。这是SQL Server吗?如果您使用的是SQL 2008,则可以使用递归CTE来完成大多数任务,而无需使用游标。一个代码示例如何,这样我们就可以看到您正在尝试做什么?假设您有一个充满某种记录的表。然后你有一个表格,里面有成对的(容器、记录、重量)或(容器、容器、重量)组合,说明每个容器中有什么。我
    DECLARE StudentdIDCursor CURSOR LOCAL FOR SELECT ...blahblah