CREATE PROCEDURE proc_name
@param1 datatype OUTPUT,
@param2 datatype OUTPUT
AS
BEGIN
SELECT @param1 = 'value1', @param2 = 'value2';
END
DECLARE @out1 datatype, @out2 datatype;
EXEC proc_name @out1 OUTPUT, @out2 OUTPUT;
PRINT @out1;
PRINT @out2;
CREATE PROCEDURE ch
@ch VARCHAR(55) OUTPUT,
@PING VARCHAR(45) OUTPUT
AS
BEGIN
SELECT @ch = 'ffgfgfg', @PING = 'chenssksksk';
END
GO
DECLARE @chs VARCHAR(55), @pins VARCHAR(45);
EXECUTE ch @chs OUTPUT, @pins OUTPUT;
PRINT @chs; -- ffgfgfg
PRINT @pins; -- chenssksksk
CREATE PROCEDURE PIN
AS
BEGIN
RETURN 1;
END
GO
DECLARE @NUM INT;
EXEC @NUM = PIN; -- 必須用 EXEC @var = proc
PRINT @NUM; -- 1
CREATE FUNCTION dbo.jian()
RETURNS VARCHAR(500)
AS
BEGIN
DECLARE @ch VARCHAR(50);
SET @ch = 'dkdkkddk';
RETURN @ch;
END
GO
SELECT dbo.jian(); -- dkdkkddk
| 特性 | 預存程序 | 函數 |
|---|---|---|
| 返回值 | 可多個 OUTPUT 參數 + 1 個 INT RETURN | 單一 RETURNS 型別值 |
| 呼叫方式 | EXEC / EXECUTE | SELECT func() / SET @v = func() |
| 可用於 SELECT | 否 | 是 |
| 可執行 DML | 是 | 否(僅限表值函數可插入) |
| 事務控制 | 可用 BEGIN TRAN | 不可 |
| 錯誤寫法 | 正確寫法 | 說明 |
|---|---|---|
SET EXECUTE @NUM=PIN | EXEC @NUM = PIN | 接收 RETURN 值用 EXEC @var = proc |
| 函數內用 INSERT/UPDATE | 改用預存程序 | 標量函數不可執行 DML |
| OUTPUT 參數未加 OUTPUT 關鍵字 | 呼叫端也要加 OUTPUT | 雙邊都需宣告 OUTPUT |
掌握以上語法,即可在 MSSQL 中靈活運用預存程序與函數實現複雜業務邏輯與參數傳遞。