基礎
建立最簡單的 預存程序(stored procedure),名稱為 myTestProcedure :
CREATE OR ALTER PROCEDURE myTestProcedure
AS
BEGIN
SELECT * FROM Users;
END
GO
執行名稱為 myTestProcedure 的預存程序:
EXEC myTestProcedure;
刪除名稱為 myTestProcedure 的預存程序:
DROP PROCEDURE myTestProcedure;
預存程序位於 SSMS 內資料庫 > 可程式性 > 預存程序:
傳入參數
定義有傳入參數的預存程序:
CREATE OR ALTER PROCEDURE myTestProcedure(
@id nvarchar(450)
)
AS
BEGIN
SELECT * FROM Users where Id = @id
END
GO
帶參數呼叫:
EXEC myTestProcedure 'AAA';
也可以指定具體參數名稱:
EXEC myTestProcedure @id = 'AAA';
也可以定義多個參數:
CREATE OR ALTER PROCEDURE myTestProcedure(
@id nvarchar(450),
@name nvarchar(450)
)
AS
BEGIN
SELECT * FROM Users where Id = @id or UserName = @name
END
GO
參數預設值
定義參數後如果執行預存程序時沒有傳入參數會拋出以下錯誤:
[S0004][201] Line 0: Procedure or function 'myTestProcedure' expects parameter '@id', which was not supplied.
但是如果有些參數不是必要的不需要傳入可以怎麼做?可以透過指定預設值就可以變成非必填:
CREATE OR ALTER PROCEDURE myTestProcedure(
@id nvarchar(450) = NULL
)
AS
BEGIN
IF @id IS NULL
RETURN; -- 提前返回
SELECT * FROM Users where Id = @id
END
GO
區域變數
如果只有單個查詢通常不會這麼費工的去定義預存程序,預存程序通常都是拿來做複雜的運算,那區域變數該如何宣告和賦值呢?使用示範:
CREATE OR ALTER PROCEDURE myTestProcedure(
@name nvarchar(450)
)
AS
BEGIN
DECLARE @UserId nvarchar(100); -- 宣告變數
SET @UserId = (SELECT Id FROM Users where UserName = @name) -- 變數賦值
PRINT 'USER_ID: ' + @UserId -- 印出變數
SELECT * FROM Departments WHERE Creator = @UserId; -- 使用變數查詢
END
GO
延伸閱讀:
Microsoft SQL Server 在 select 中的 if else 替代方式示範(iif, case when)
參考資料:
Microsoft.Learn - Stored procedures (Database Engine)
Microsoft.Learn - Create a stored procedure
Microsoft.Learn - Execute a stored procedure
Microsoft.Learn - Delete a stored procedure
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com