承接前文,本篇深入探討儲存程序的參數定義、輸出參數應用、預設值排序規則、WITH RECOMPILE 選項,以及利用 OBJECT_ID 進行物件存在性檢查與原始碼查詢技巧。
同名編號群組(如 S1;1, S1;2)中,EXEC S1 預設執行 ;1;需執行特定編號請明確指定 EXEC S1;2。刪除時 DROP PROC S1 會移除該群組所有編號程序。
OUTPUT 參數,呼叫時必須提供引數。CREATE PROC yangyang8848.OneGoods
@GoodsCode varchar(10)
AS
SELECT * FROM Master_Goods WHERE GoodsCode = @GoodsCode;
GO
-- 呼叫方式
DECLARE @Code varchar(10) = '0004';
EXEC yangyang8848.OneGoods @Code;
OUTPUT (或縮寫 OUT) 關鍵字標記輸出參數。建立時用 OUTPUT,呼叫時用 OUT 兩者等效。
CREATE PROC yangyang8848.OneGoods
@GoodsCode2 varchar(10) OUTPUT,
@GoodsCode varchar(10) = '0011' -- 預設值參數置後
AS
SELECT * FROM Master_Goods WHERE GoodsCode = @GoodsCode;
SET @GoodsCode2 = '0005'; -- 回傳值給呼叫端
GO
-- 呼叫端需宣告變數接收輸出值
DECLARE @VV2 varchar(10);
EXEC yangyang8848.OneGoods @VV2 OUTPUT; -- 或 @VV2 OUT
SELECT @VV2 AS ReturnedCode; -- 顯示 0005
指示引擎不快取執行計畫,每次執行皆重新編譯。適用於參數值變化極大導致計畫不穩定的情境。注意: 若指定 FOR REPLICATION 則不可用;CLR 程序亦不支援。
回傳結構描述範圍內物件的資料庫識別碼。常用於「存在即刪除」的安全建立模式:
IF OBJECT_ID('yangyang8848.OneGoods') IS NOT NULL
DROP PROC yangyang8848.OneGoods;
GO
CREATE PROC yangyang8848.OneGoods
@GoodsCode2 varchar(10) OUT,
@GoodsCode varchar(10) = '0011'
AS
SELECT * FROM Master_Goods WHERE GoodsCode = @GoodsCode;
SET @GoodsCode2 = '0005';
GO
透過 sys.sql_modules 目錄檢視可取得未加密程序的完整定義:
SELECT definition
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('yangyang8848.OneGoods');