預存程序支援遞歸呼叫自身,但**必須設計明確終止條件**防止無限遞歸導致堆疊溢位(預設最大巢狀層級 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;
IF @InputValue != 1 會無限遞歸,最終報錯 Maximum stored procedure nesting level exceeded (limit 32)。-- 迴圈版
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 ... -- 幾何平均數技巧