数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

SQL在存储过程中使用递归


发布日期:2018年02月09日
 
SQL在存储过程中使用递归

递归的基本概念非常简单一段给定的代码对自身进行调用直到某些边界条件得到满足在本文中我们将演示如何在TSQL中使用递归

在我的眼中递归是最为精致的程序结构之一我已经在许多场合用不同的编程语言实现过它递归的基本概念非常简单一段给定的代码对自身进行调用直到某些边界条件得到满足我将通过下面的内容展示如何在TSQL中使用递归我所用到的是递归的经典例子阶乘计算

阶乘的意思就是将小于等于这一数字的所有数字相乘直至乘到例如factorial()即等于 * * * * * * * * (你也可以加上*但似乎是多此一举)

以下代码即实现了阶乘

CREATE PROCEDURE [dbo][Factorial_ap]

(

@Number Integer

@RetVal Integer OUTPUT

)

AS

DECLARE @In Integer

DECLARE @Out Integer

IF @Number !=

BEGIN

SELECT @In = @Number –

EXEC Factorial_ap @In @Out OUTPUT

SELECT @RetVal = @Number * @Out

END

ELSE

BEGIN

SELECT @RetVal =

END

RETURN

GO

假设你需要计算factorial(n)这一过程将对自身调用(n)次SQL Server允许调用深度高达次的递归但到了次的时候你就会遭遇到算法溢出(arithmetic overflow)警告如果你希望计算大型数据的阶乘你应该将变量声明为BigInt 而非Integer这样一来你就可以计算factorial(结果是这一结果的增长是如此迅速因而如果是计算factorial(那么这一限制将被再次突破

尽管阶乘机制非常美妙但在日常编程中似乎没有多少机会用到然而上面的代码还是精确的展示了递归的基本原理和具体的实践

在一些实际问题中递归都将是一种有价值的编程技巧其中一个经典的编程问题名为Bill of Materials(用料单)该问题有至少两种应用

给出所需对象的一个实例求出构造此实例的用料单

指定组成某个对象的若干对象的详细目录求出能够构造出多少对象?

现在让我们来假设我们已经有了对象O它是由四个X对象和三个Y对象以及七个Z对象组成因此要构造一个单独的O对象显然我们将会需要四个X对象三个Y对象和七个Z对象然而对象Y和Z都需要一定数量的Q对象(例如对螺丝指定周长螺栓样式螺帽样式)因此我们需要分析对象Y和X确定它们所需要的Q对象个数然后再确定我们能提供相应总数如果不能那么我们将无法创建对象Q

SQL Server 无法较方便的解决这一问题除非你能够提前知道递归层次然而SQL 测试版在这一问题上已经进行了很长时间的研究SQL项目负责人Joe Celko提供了非常巧妙的解决办法该办法涉及到在行插入(rowinsert)时间对递归层次进行跟蹤这一解决方案非常有用但需要使用触发器或类似机制通过每一次插入更新或删除来更新层次深度队列你可以查看这种方法在Access下的实现随后就可以方便的将这种解决方案引入到SQL Server中并根据自己的需要进行修改               

上一篇:跟我学SQL:从子表里删除数据

下一篇:在SQLServer成批导入数据