在 SQL Server 中要使用迴圈逐一執行或是歷遍某個清單資料,我們可以使用 WHILE 迴圈達成。
但是在 SQL Server 的變數資料型態中並沒有 Array 或是 List 這樣的「清單」讓我們直接使用,不過我們可以建立一個資料型態為「資料表(Table)」的變數來暫時儲存多筆資料,讓我們在跑迴圈時可以取用這些資料。
參考資料:
Microsoft.Learn - WHILE (Transact-SQL)
但是在 SQL Server 的變數資料型態中並沒有 Array 或是 List 這樣的「清單」讓我們直接使用,不過我們可以建立一個資料型態為「資料表(Table)」的變數來暫時儲存多筆資料,讓我們在跑迴圈時可以取用這些資料。
方法一:使用變數作為索引
-- 定義一個資料型態為 TABLE 的變數,變數名稱為 @ItemList
-- @ItemList 資料表有兩個變數,分別為 INT 型態的 Id 與 字串型態的 Item
-- Id 欄位會自動填入和自動遞增,從 1 開始,每次增加 1
DECLARE @ItemList TABLE (Id INT IDENTITY(1,1), Item NVARCHAR(50));
INSERT INTO @ItemList (Item)
VALUES ('Item1'),
('Item2'),
('Item3'),
('Item4'),
('Item5'),
('Item6');
DECLARE @CurrentId INT = 1; -- 用於追踪目前的 Id
DECLARE @MaxId INT; -- 用於存儲最大 Id
DECLARE @Item NVARCHAR(50); -- 用於存儲當前 Item 值
-- 獲取最大 Id
SELECT @MaxId = MAX(Id) FROM @ItemList;
-- 使用 WHILE 迴圈列印內容
WHILE @CurrentId <= @MaxId
BEGIN
-- 獲取當前項目
SELECT @Item = Item
FROM @ItemList
WHERE Id = @CurrentId;
-- 列印當前項目
PRINT @Item;
-- 遞增 Id
SET @CurrentId = @CurrentId + 1;
END;
方法二:使用游標(Cursor)
DECLARE @ItemList TABLE (Item NVARCHAR(50));
INSERT INTO @ItemList (Item)
VALUES ('Item1'),
('Item2'),
('Item3'),
('Item4'),
('Item5'),
('Item6');
-- 定義 Item 欄位的游標(Cursor)
DECLARE ItemCursor CURSOR FOR SELECT Item FROM @ItemList;
-- 開啟游標
OPEN ItemCursor;
-- 宣告變數來暫存 Item 欄位內容
DECLARE @Item NVARCHAR(50);
FETCH NEXT FROM ItemCursor INTO @Item;
WHILE @@FETCH_STATUS = 0 -- 有下一筆時繼續執行迴圈
BEGIN
-- 印出每一列的內容
PRINT @Item;
-- 讀取下一列
FETCH NEXT FROM ItemCursor INTO @Item;
END;
-- 關閉游標
CLOSE ItemCursor;
-- 釋放游標資源
DEALLOCATE ItemCursor;
參考資料:
Microsoft.Learn - WHILE (Transact-SQL)
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com