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

SQL Server 預存程序語法完整解析:CREATE PROCEDURE 參數與選項詳解

     編輯:關於SqlServer

語法結構

CREATE PROC[EDURE] procedure_name [ ; number ]
    [ { @parameter data_type } 
        [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]
[ WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]

關鍵參數詳細說明

元素說明
procedure_name預存程序名稱,符合識別碼規則。
區域暫存:#name(僅目前工作階段可見)。
全域暫存:##name(所有工作階段可見)。
完整名稱含 # 不超過 128 字元。
;number選用整數,將同名程序分組,便於一次 DROP PROCEDURE name 刪除整組。例:orderproc;1、orderproc;2。
@parameter參數名稱,以 @ 開頭,符合識別碼規則。最多 2,100 參數。僅能替代常數,不可替代表名、欄位名等物件名稱。
data_type參數資料類型。所有類型皆可用,但 cursor 僅限 OUTPUT 參數,且必須同時指定 VARYING。
VARYING指定輸出參數為動態結果集(僅游標參數適用)。
default參數預設值(常數或 NULL)。若含 LIKE 可使用萬用字元(%、_、[]、[^])。
OUTPUT標示為輸出參數,可將值回傳給呼叫端。text、ntext、image 亦可為 OUTPUT。
WITH RECOMPILE不快取執行計畫,每次執行重新編譯。適用參數值變化大、避免參數嗅探問題。
WITH ENCRYPTION加密 syscomments 中的程式碼,防止被複寫發佈。
FOR REPLICATION標示為複寫用程序,不可直接由使用者執行。

實用範例

1. 基本帶輸入/輸出參數

CREATE PROCEDURE dbo.GetOrderTotal
    @OrderID INT,
    @TotalAmount MONEY OUTPUT
AS
BEGIN
    SELECT @TotalAmount = SUM(UnitPrice * Quantity)
    FROM dbo.OrderDetails
    WHERE OrderID = @OrderID;
END;
GO

2. 預設值與選用參數

CREATE PROCEDURE dbo.SearchProducts
    @CategoryID INT = NULL,
    @Keyword NVARCHAR(50) = '%'
AS
BEGIN
    SELECT ProductID, ProductName, UnitPrice
    FROM dbo.Products
    WHERE (@CategoryID IS NULL OR CategoryID = @CategoryID)
      AND ProductName LIKE @Keyword;
END;
GO

3. 使用 WITH RECOMPILE 解決參數嗅探

CREATE PROCEDURE dbo.GetRecentOrders
    @CustomerID NCHAR(5),
    @DaysBack INT = 30
WITH RECOMPILE
AS
BEGIN
    SELECT OrderID, OrderDate
    FROM dbo.Orders
    WHERE CustomerID = @CustomerID
      AND OrderDate >= DATEADD(DAY, -@DaysBack, GETDATE());
END;
GO

最佳實務建議

  • 永遠使用 CREATE PROCEDURE dbo.名稱 明確指定結構描述。
  • 參數命名統一使用 @PascalCase(如 @OrderID)。
  • 避免在程序中使用 SELECT *,明確列出欄位。
  • 適度使用 WITH RECOMPILE,避免過度編譯造成 CPU 壓力。
  • 敏感邏輯使用 WITH ENCRYPTION,但需注意加密後無法檢視定義,備份腳本時需保留原始碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved