遞歸的基本概念非常簡單
一段給定的代碼對自身進行調用
直到某些邊界條件得到滿足
在本文中
我們將演示如何在T
SQL中使用遞歸
在我的眼中
遞歸是最為精致的程序結構之一
我已經在許多場合用不同的編程語言實現過它
遞歸的基本概念非常簡單
一段給定的代碼對自身進行調用
直到某些邊界條件得到滿足
我將通過下面的內容展示如何在T
SQL中使用遞歸
我所用到的是遞歸的經典例子
階乘計算
階乘的意思就是將小於等於這一數字的所有數字相乘
直至乘到
例如
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提供了非常巧妙的解決辦法
該辦法涉及到在行插入(row
insert)時間對遞歸層次進行跟蹤
這一解決方案非常有用
但需要使用觸發器或類似機制通過每一次插入
更新或刪除來更新層次深度隊列
你可以查看這種方法在Access下的實現
隨後就可以方便的將這種解決方案引入到SQL Server中
並根據自己的需要進行修改
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22190.html