| 優勢 | 說明 |
| 效能 | 建立時編譯、首次執行產生計畫並快取,省略編譯/最佳化步驟;網路僅傳 `EXEC proc` 指令,減少流量 |
| 維護性 | 邏輯集中於伺服器,修改透明於用戶端,無需重新編譯/部署應用程式 |
| 安全性 | 用戶無需資料表直接權限,僅授 `EXECUTE` 權限即可執行含 DML 的預存程序 |
建立預存程序完整語法
CREATE PROC[EDURE] procedure_name [;number]
[@parameter data_type [= default] [OUTPUT]] [, ...n]
[WITH {RECOMPILE | ENCRYPTION}]
[FOR REPLICATION]
AS
-- T-SQL 陳述式
GO
- `;number`:同名程序分組,`DROP PROCEDURE name` 可一次刪除整組
- `OUTPUT`:輸出參數,呼叫端可接收回傳值
- `WITH RECOMPILE`:每次執行重新編譯(參數嗅探問題時使用)
- `WITH ENCRYPTION`:`syscomments` 內容加密,隱藏邏輯
- `FOR REPLICATION`:僅複寫代理程式可執行,一般連線不可呼叫
範例:帶參數查詢
CREATE PROCEDURE ap_GetAuthorsForPublisher
@PublisherName VARCHAR(40) = 'New Moon Books' -- 預設值
AS
SELECT a.au_lname, a.au_fname
FROM authors a
JOIN titleauthor ta ON a.au_id = ta.au_id
JOIN titles t ON ta.title_id = t.title_id
JOIN publishers p ON t.pub_id = p.pub_id
WHERE p.pub_name = @PublisherName
GO
參數傳遞方式
- 依位置:`EXEC ap_GetAuthorsForPublisher 'Binnet & Hardley'`
- 依名稱:`EXEC ap_GetAuthorsForPublisher @PublisherName = 'Binnet & Hardley'`(推薦,順序不拘)
- 預設值:呼叫時省略參數 → 使用建立時定義的預設值
觸發器基本觀念
- 特殊預存程序,由資料操作事件自動觸發(`INSERT`/`UPDATE`/`DELETE`)
- 不接受參數、不可直接呼叫、不可回傳結果集給用戶端
- 存取虛擬資料表:`inserted`(新資料)、`deleted`(舊資料)
- 用途:複雜業務規則、稽核軌跡、衍生資料維護、跨資料表一致性
系統資料表記錄
- `sysobjects`:`type = 'P'` 為預存程序,`'TR'` 為觸發器
- `syscomments`:儲存程式碼文字(`WITH ENCRYPTION` 時加密)
- 上一篇文章: SQL Server 入門(六):預存程序主體結構、流程控制與游標應用
- 下一篇文章: SQL Server 入門(四):文字/影像資料操作與 DML 基礎指令
Copyright ©
程式碼之家 All Rights Reserved