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

SQL Server 預存程序優勢與結構解析

     編輯:關於SqlServer

預存程序四大優勢

優勢說明
預先編譯執行計畫建立時編譯,重複呼叫重用計畫,減少編譯 CPU 開銷。
降低網路傳輸將冗長 SQL 壓縮為單行呼叫(EXEC proc @p1, @p2),節省頻寬與延遲。
程式碼重用與模組化多應用程式共用同一邏輯,修改集中在資料庫端,減少部署成本。
強化安全性授權使用者 EXECUTE 權限於程序,無需授予底層資料表 SELECT/INSERT/UPDATE/DELETE 權限。

基本結構

CREATE PROCEDURE dbo.ProcName
    @InputParam  INT,
    @OutputParam INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;  -- 減少網路封包(DONE_IN_PROC)
    -- 邏輯處理
    SELECT @OutputParam = COUNT(*) FROM dbo.Table WHERE Col = @InputParam;
    RETURN 0;  -- 回傳狀態碼
END;
GO

實務範例:庫存查詢封裝

情境:倉管人員頻繁查詢庫存量與可出貨量。

CREATE PROCEDURE dbo.GetInventoryStatus
    @ProductID INT
AS
BEGIN
    SET NOCOUNT ON;
    SELECT 
        p.ProductName,
        i.QtyOnHand,
        i.QtyAvailable,
        CASE WHEN i.QtyAvailable > 0 THEN '可出貨' ELSE '缺貨' END AS Status
    FROM dbo.Inventory i
    JOIN dbo.Products p ON p.ProductID = i.ProductID
    WHERE i.ProductID = @ProductID;
END;
GO

前端僅需呼叫 EXEC dbo.GetInventoryStatus @ProductID = 123,不需知道表結構與聯結邏輯。

進階技巧

  • 動態 SQL:搭配 sp_executesql 參數化,防止注入。
  • 錯誤處理:TRY...CATCH 區塊搭配 THROW (SQL 2012+) 或 RAISERROR。
  • 交易控制:BEGIN TRAN...COMMIT/ROLLBACK,注意巢狀交易計數 @@TRANCOUNT。
  • 暫存表 vs 表變數:大量資料用暫存表(有統計資料、可建索引),小量用表變數(低鎖定、記憶體優先)。

最佳實務清單

  1. 命名規範:dbo.動詞_名詞(如 Get_OrderDetail)。
  2. 所有參數加型別與預設值,輸出參數明確 OUTPUT。
  3. 開頭 SET NOCOUNT ON、SET XACT_ABORT ON(交易自動回滾)。
  4. 避免 SELECT *,明確列出欄位。
  5. 適度註解:用途、參數、回傳值、修改紀錄。
  6. 版本控管:將建立腳本納入資料庫專案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved