輸入參數 N(1~100),輸出 1+2+...+N 的和。
CREATE PROCEDURE dbo.Sum1ToN
@N INT,
@Sum INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
-- 參數校驗
IF @N < 1 OR @N > 100
BEGIN
RAISERROR('參數 N 必須在 1 到 100 之間', 16, 1);
RETURN -1;
END
-- 方法一:迴圈累加(教學演示)
DECLARE @i INT = 1, @total INT = 0;
WHILE @i <= @N
BEGIN
SET @total += @i;
SET @i += 1;
END
SET @Sum = @total;
-- 方法二:高斯公式(生產推薦,O(1))
-- SET @Sum = @N * (@N + 1) / 2;
-- 返回結果
PRINT '1 到 ' + CAST(@N AS VARCHAR) + ' 的和為: ' + CAST(@Sum AS VARCHAR);
RETURN 0;
END
DECLARE @Result INT;
EXEC dbo.Sum1ToN @N = 10, @Sum = @Result OUTPUT;
PRINT '輸出參數 @Result = ' + CAST(@Result AS VARCHAR);
| 要點 | 說明 |
|---|---|
| `@Sum INT OUTPUT` | 聲明輸出參數,調用時需 `DECLARE` 變量並加 `OUTPUT` 關鍵字 |
| `SET NOCOUNT ON` | 禁止返回「受影響行數」干擾客戶端結果集解析 |
| 參數校驗 | 業務邊界防護,拋出用戶友好錯誤 |
| 高斯公式 | `N*(N+1)/2` 避免迴圈,效能極高,N=100 時差異微小但習慣重要 |
| `PRINT` 訊息 | 便於 SSMS 直接運行查看,生產環境可改為 `SELECT @Sum AS Result` |
CREATE PROCEDURE dbo.Sum1ToN_CTE
@N INT,
@Sum INT OUTPUT
AS
BEGIN
;WITH nums AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM nums WHERE n < @N
)
SELECT @Sum = SUM(n) FROM nums
OPTION (MAXRECURSION 100); -- 防止無限遞歸
END
掌握「參數校驗 → 核心邏輯(公式優先) → 輸出賦值 → 友好提示」這一存儲過程標準結構,可應對絕大多數簡單計算類需求。