遞歸是「代碼調用自身直到邊界條件滿足」的優雅結構。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
| 風險 | 對策 |
|---|---|
| 最大嵌套層級 32 | 深度遞歸改用迴圈或 CTE(SQL 2005+ 支持遞歸 CTE,無層級限制) |
| 計劃緩存膨脹 | 每層遞歸產生獨立計劃,高頻調用考慮參數化或改寫 |
| 事務管理 | 遞歸層級間共享事務上下文,錯誤處理需統一回滾邏輯 |
| 性能 | 純計算類遞歸 T-SQL 慢於 CLR/.NET,權衡後選擇 |
SQL Server 2005+ 強烈建議使用遞歸 CTE(WITH cte AS (SELECT ... UNION ALL SELECT ... FROM cte JOIN ...))替代存儲過程遞歸:單語句、集合化、優化器友好、無嵌套限制。