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

SQL Server 預存程序遞歸呼叫實作:階乘計算範例與終止條件設計

     編輯:關於SqlServer

預存程序支援遞歸呼叫自身,但**必須設計明確終止條件**防止無限遞歸導致堆疊溢位(預設最大巢狀層級 32)。以階乘計算示範遞歸邏輯與 OUTPUT 參數傳遞。

遞歸預存程序:階乘計算

CREATE PROC [dbo].[usp_spFactorial] 
    @InputValue INT, 
    @OutputValue INT OUTPUT
AS
BEGIN
    DECLARE @InValue INT, @OutValue INT;
    
    IF @InputValue != 1  -- 終止條件:遞歸基底案例
    BEGIN
        SET @InValue = @InputValue - 1;
        EXEC usp_spFactorial @InValue, @OutValue OUTPUT;  -- 遞歸呼叫
        SELECT @OutputValue = @InputValue * @OutValue;   -- 回傳累乘結果
    END
    ELSE
    BEGIN
        SET @OutputValue = 1;  -- 基底案例:1! = 1
    END
END;
GO

呼叫測試

DECLARE @Result INT;
EXEC usp_spFactorial 5, @Result OUTPUT;  -- 5! = 120
SELECT @Result AS FactorialResult;

關鍵注意事項

  1. 終止條件不可少:缺少 IF @InputValue != 1 會無限遞歸,最終報錯 Maximum stored procedure nesting level exceeded (limit 32)。
  2. 最大巢狀層級 32:SQL Server 限制預存程序/觸發器/函數呼叫深度總和 ≤ 32。階乘 > 32 會失敗,需改用迴圈或數學函數。
  3. OUTPUT 參數傳遞:遞歸層層需宣告區域變數接收下層結果,再計算本層結果回傳上層。
  4. 建立時警告:建立遞歸程序時 SSMS 會提示「Recursive stored procedure...」,屬正常提醒非錯誤。

非遞歸替代方案(效能更佳、無深度限制)

-- 迴圈版
CREATE PROC usp_Factorial_Iterative @InputValue INT, @OutputValue INT OUTPUT AS
BEGIN
    SET @OutputValue = 1;
    WHILE @InputValue > 1 BEGIN
        SET @OutputValue = @OutputValue * @InputValue;
        SET @InputValue = @InputValue - 1;
    END
END;

-- 或直接數學計算(大數值需考慮溢位)
SELECT EXP(SUM(LOG(value))) FROM ...  -- 幾何平均數技巧

適用場景建議

  • **遞歸適合**:階層式資料巡覽(組織架構、BOM 展開)、CTE 更適合但舊版無 CTE 時、邏輯天然遞歸且深度可控(< 32)。
  • **避免遞歸**:純數學計算(階乘、費波那契)、大量資料迭代、深度不可預測的樹狀結構。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved