熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

SQL在存儲過程中使用遞歸

2013-11-15 14:41:47  來源: SQL Server 

  遞歸的基本概念非常簡單一段給定的代碼對自身進行調用直到某些邊界條件得到滿足在本文中我們將演示如何在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中並根據自己的需要進行修改
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22190.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.