编写递归存储过程

时间:2009-06-01 15:57:05

标签: tsql variables recursion list

基本上我在存储过程中想要的是返回一个表列表,将该列表存储在一个变量中;我需要遍历列表中的每个项目以递归方式调用此存储过程。最后,我需要一个由此递归构建的整体listOfTables。 任何帮助都将非常感激

5 个答案:

答案 0 :(得分:2)

如果您使用的是SQL2005或更高版本,则应该查看Common Table Expressions(不确定它们是否可以在您的特定情况下提供帮助,但这是大多数递归查询的重要替代方法)。递归过程不能嵌套超过32级,并且不是很优雅。

答案 1 :(得分:2)

您可以使用CTE

WITH  q (column1, column2) (
        SELECT  *
        FROM    table
        UNION ALL
        SELECT  *
        FROM    table
        JOIN    q
        ON      …
        )
SELECT   *
FROM     q

但是,存在不同的限制:您不能使用聚合,分析函数,TOP子句等。

答案 2 :(得分:0)

您是在递归之后还是只是遍历所有表格?如果您正在使用Sql Server 2005并想要遍历所有表,您可以在SP中使用表变量,尝试沿着这些行:

declare @TableList as table (
    ID int identity (1,1),
    TableName varchar(500)
)

insert into @TableList (TableName)
select name
from sys.tables

declare @count int
declare @limit int
declare @TableName varchar(500)

set @count = 1
select @limit = max(ID) from @TableList

while @count <= @limit
    begin
        select @TableName = TableName from @TableList where ID = @count
        print @TableName --replace with call to SP

        set @count = @count + 1
    end

print @TableName替换为对SP的调用,如果您不希望它在数据库中的每个表上运行,则将查询select name from sys.tables更改为仅返回您之后的表

答案 3 :(得分:0)

CTE很可能会满足您的要求。

如果你真的必须使用存储过程而不是查询,那么你所要做的就是遍历表列表然后你可以使用你选择的代码来遍历表列表并调用过程。在我输入lol时,Macros已经发布了如何做到这一点。正如Mehrdad已经告诉过你的那样,SQL Server允许的嵌套级别数量有限,并且相当浅。我不相信你的解释,你需要一个递归调用,它看起来更像是对列表的简单迭代,但如果确实需要递归,那么请记住CS 101类: any recursive algorithm can be transformed into a non-recursive one by using a loop iteration and a stack

答案 4 :(得分:-3)

存储过程非常有用。 BUT。

我最近不得不在一个严重依赖存储过程的系统上工作。这是一场噩梦。一半的业务逻辑使用一种语言(在本例中为Java),另一半是存储过程中的数据库。更糟糕的是,一半的应用程序受源代码控制,另一半是数据库崩溃而不是永远丢失(糟糕的备份过程)。此外,我用于扫描,分析和维护源代码的所有可爱的小工具都无法使用数据库中的源。

我本身并不是反存储程序,但是哦,它们如何被滥用。当您需要针对来自多个源的数据实施规则时,存储过程非常适合,并且没有更好的方法可以从Web服务器(以及DBMS服务器)上卸载重型记录访问。但在大多数情况下,我宁愿使用视图而不是存储过程和业务逻辑的应用程序编程语言。我知道这会让事情变得更复杂一点。但它可以让生活变得更加轻松。