SQL Server WHILE 迴圈使用示範

在 SQL Server 中要使用迴圈逐一執行或是歷遍某個清單資料,我們可以使用 WHILE 迴圈達成。

但是在 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)

留言