iT邦幫忙

DAY 10
8

T-SQL 應用之美系列 第 10

使用流程控制:BEGIN...END 與 RETURN

不管哪一種程式語言都具備流程控制的功能,用來控制程式執行與流程的流向,透過流程控制可以讓程式更容易維護。
這次我們要討論 BEGIN...ENDRETURN
要讓多個 T-SQL 陳述式變成一個邏輯的區塊,就可以使用 BEGIN...END 來讓 SQL Server 把它們視為單一的區塊來處理。

至於 RETURN 則能夠立即無條件地終止一個查詢、預存程序或是批次,也就是說,位於 RETURN 之後的程式碼都不會被執行。

就拿先前討論的「如何使用 T-SQL 計算年齡」來作為範例,下面的程式碼是建立一個自訂計算年齡的函數,最後再呼叫這個函數:

-- 建立自訂函數
CREATE FUNCTION dbo.fn_GetAge(
@myDate datetime)
RETURNS int
AS
BEGIN

-- 宣告變數
DECLARE @age int, @day datetime

-- 以「年」為單位計算出年齡
SET @age = DATEDIFF(yy, @myDate, getdate()) -
		CASE WHEN @day < DATEADD(yy, DATEDIFF(yy, @myDate, @day), @myDate)
			THEN 1
			ELSE 0
		END
RETURN @age

END
GO

-- 呼叫自訂的函數
SELECT dbo.fn_GetAge('19990818') 年齡

執行結果如下:

下面的程式碼則是建立預存程序來計算年齡,然後自訂變數來接收預存程序傳回的結果,最後再使用 SELECT 把結果顯示出來:

-- 建立預存程序
CREATE PROCEDURE proc_GetAge1(
@myDate datetime)
AS
BEGIN

-- 宣告變數
DECLARE @age int, @day datetime

-- 以「年」為單位計算出年齡
SET @age = DATEDIFF(yy, @myDate, getdate()) -
		CASE WHEN @day < DATEADD(yy, DATEDIFF(yy, @myDate, @day), @myDate)
			THEN 1
			ELSE 0
		END
-- 使用 RETURN 傳回結果
RETURN @age

END
GO

-- 呼叫預存程序
DECLARE @result int
EXEC @result = dbo.proc_GetAge1 '19990818'
SELECT @result 年齡

執行結果如下:

我們可以看到再呼叫預存程序時,那樣的寫法有點囉唆,那是因為在預存程序裡面,使用 RETURN 傳回結果,如果改用 SELECT 的話,在呼叫預存程序時,就很簡單了:

-- 建立預存程序
CREATE PROCEDURE dbo.proc_GetAge2(
@myDate datetime)
AS
BEGIN

-- 宣告變數
DECLARE @age int, @day datetime

-- 以「年」為單位計算出年齡
SET @age = DATEDIFF(yy, @myDate, getdate()) -
		CASE WHEN @day < DATEADD(yy, DATEDIFF(yy, @myDate, @day), @myDate)
			THEN 1
			ELSE 0
		END

-- 使用 SELECT 傳回結果
SELECT @age

END
GO

-- 呼叫預存程序
EXEC dbo.proc_GetAge2 '19990818'

執行結果如下:


上一篇
如何使用 CAST 與 CONVERT 格式化日期與時間資料
下一篇
使用流程控制:WHILE、BREAK 與 CONTINUE
系列文
T-SQL 應用之美30

尚未有邦友留言

立即登入留言