首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 存儲過程遞歸實戰:階乘計算與通用模板

     編輯:關於SqlServer

遞歸是「代碼調用自身直到邊界條件滿足」的優雅結構。T-SQL 支持存儲過程遞歸(默認最大嵌套 32 級),經典案例為階乘計算。

階乘遞歸存儲過程

CREATE PROCEDURE dbo.Factorial
  @Number INT,
  @Result INT OUTPUT
AS
BEGIN
  DECLARE @In INT, @Out INT
  IF @Number <= 1
  BEGIN
    SELECT @Result = 1
    RETURN
  END
  SELECT @In = @Number - 1
  EXEC dbo.Factorial @In, @Out OUTPUT
  SELECT @Result = @Number * @Out
  RETURN
END

調用示例

DECLARE @Ret INT
EXEC dbo.Factorial 10, @Ret OUTPUT
PRINT @Ret  -- 3628800

遞歸在 T-SQL 中的工程化注意點

風險對策
最大嵌套層級 32深度遞歸改用迴圈或 CTE(SQL 2005+ 支持遞歸 CTE,無層級限制)
計劃緩存膨脹每層遞歸產生獨立計劃,高頻調用考慮參數化或改寫
事務管理遞歸層級間共享事務上下文,錯誤處理需統一回滾邏輯
性能純計算類遞歸 T-SQL 慢於 CLR/.NET,權衡後選擇

適用場景

  • 層級結構遍歷:組織架構、BOM 物料清單、分類樹
  • 路徑查找:最短路徑、依賴鏈分析
  • 數學序列:斐波那契、漢諾塔等教學演示

SQL Server 2005+ 強烈建議使用遞歸 CTE(WITH cte AS (SELECT ... UNION ALL SELECT ... FROM cte JOIN ...))替代存儲過程遞歸:單語句、集合化、優化器友好、無嵌套限制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved