iT邦幫忙

DAY 11
11

T-SQL 應用之美系列 第 11

使用流程控制:WHILE、BREAK 與 CONTINUE

不管哪一種語言都具備流程控制的功能,用來控制程式執行與流程的流向,透過流程控制可以讓程式更容易維護。
這次我們要討論經常與 WHILE 合用的兩個 T-SQL 陳述式:BREAK 與 CONTINUE。
BREAK 陳述式可以從最內層的 WHILE 迴圈離開,而 CONTINUE 陳述式則是重新執行 WHILE 迴圈。換句話說,就是當找不到符合的資料時,程式會執行 BREAK 的那段陳述式;而如果需要繼續執行程式碼,自然就會執行 CONTINUE 那段陳述式。

先來個簡單的例子,計算從 1 加到 100 的總和好了:

-- 定義變數
DECLARE @count int, @sum int

-- 指定初始值
SET @count = 0
SET @sum = 0

-- 開始計算
WHILE (@count < 101)
	BEGIN
		SET @sum = @sum + @count
		SET @count = @count + 1
	END

-- 顯示結果
SELECT @sum 總和

執行結果如下:

通常我們會在 WHILE 迴圈中,使用 @@FETCH_STATUS 判斷是否要繼續從 CURSOR 中,抓資料出來:

USE AdventureWorks
GO

-- 定義變數
DECLARE @Name nvarchar(50)

-- 定義 CURSOR
DECLARE myCursor CURSOR FOR
	SELECT [Name] FROM Sales.Store

-- 開啟 CURSOR
OPEN myCursor

-- 抓出資料
FETCH NEXT FROM myCursor
	INTO @Name

-- 檢查 @@FETCH_STATUS 來決定是否要繼續執行
WHILE (@@FETCH_STATUS = 0)
	BEGIN
		PRINT N'商店名稱:' + @Name
		FETCH NEXT FROM myCursor
			INTO @Name
	END

-- 關閉 CURSOR
CLOSE myCursor

-- 釋放 CURSOR
DEALLOCATE myCursor

執行的部分結果如下:

最後來看一個把 SELECT 的查詢結果作為 WHILE 迴圈的條件,然後再使用 BREAK 與 CONTINUE 來決定是要離開迴圈或是繼續執行迴圈:

USE AdventureWorks
GO

-- 建立一個測試用的資料表
SELECT [Name], ListPrice INTO myTable
	FROM Production.Product

-- 未調價前的平均價格
SELECT 調價前的平均價格 = AVG(ListPrice) FROM myTable

-- 如果平均單價小於 450,則提高 2 倍價格
WHILE (SELECT AVG(ListPrice) FROM myTable) < $450
	BEGIN
		UPDATE myTable
		SET ListPrice = ListPrice * 2

		-- 找出最高的價格
		SELECT 最高的價格 = MAX(ListPrice) FROM myTable

		-- 如果最高價格超過 800,就不再調價
		-- 如果沒有超過 800,還要繼續調價
		IF (SELECT MAX(ListPrice) FROM myTable) > $800
			BREAK
		ELSE
			CONTINUE
	END

SELECT 調價後的平均價格 = AVG(ListPrice) FROM myTable

-- 刪掉測試用的資料表
DROP TABLE myTable

執行結果如下:


上一篇
使用流程控制:BEGIN...END 與 RETURN
下一篇
使用流程控制:IF...ELSE
系列文
T-SQL 應用之美30

尚未有邦友留言

立即登入留言