首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> SQL Server 2005

SQL Server 2005 預存程序中使用 WHILE 迴圈的正確寫法

     編輯:SQL Server 2005

在 SQL Server 2005 的預存程序中撰寫迴圈時,迴圈主體必須使用 BEGIN ... END 區塊,而非其他資料庫常見的 WHILE ... END WHILE 或 LOOP ... END LOOP 語法。本文提供經測試可行的範本與關鍵提醒。

標準範本

CREATE PROCEDURE usp_DeleteUsersByPattern
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @userId VARCHAR(50);
    DECLARE @cnt INT = 0;

    -- 先取得符合條件的總筆數
    SELECT @cnt = COUNT(*) FROM UserService_User WHERE Account LIKE '%111%';

    WHILE @cnt > 0
    BEGIN
        -- 每次迴圈取一筆 ID (實務建議用游標或 TOP 1 配合 ORDER BY)
        SELECT TOP 1 @userId = Id FROM UserService_User WHERE Account LIKE '%111%';

        -- 呼叫另一個預存程序刪除
        EXEC UserService_RemoveUserByUserId @userId;

        SET @cnt = @cnt - 1;
    END
END
GO

關鍵點總結

  1. 迴圈區塊:WHILE 條件 BEGIN ... END,不可寫成 END WHILE。
  2. 變數宣告:SQL Server 2005 支援 DECLARE @var TYPE = 初值 初始化語法 (2008+ 完整支援,2005 部分支援,建議分行 SET)。
  3. 巢狀呼叫:迴圈中可直接 EXEC 另一個_SP @參數,多參數以逗號分隔。
  4. 效能提醒:範例中每次迴圈都重新掃描表格,大量資料時效能極差。實務應改用 游標 或 集合式操作 (如單一 DELETE 配合 WHERE),或將 ID 先存入暫存表/表值變數再逐筆處理。

改良版:使用游標避免重複掃描

CREATE PROCEDURE usp_DeleteUsersByPattern_V2
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @userId VARCHAR(50);
    DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
        SELECT Id FROM UserService_User WHERE Account LIKE '%111%';

    OPEN cur;
    FETCH NEXT FROM cur INTO @userId;
    WHILE @@FETCH_STATUS = 0
    BEGIN
        EXEC UserService_RemoveUserByUserId @userId;
        FETCH NEXT FROM cur INTO @userId;
    END
    CLOSE cur;
    DEALLOCATE cur;
END
GO

最佳實務:集合式刪除 (效能最佳)

-- 若無複雜邏輯,直接單一陳述式完成
DELETE FROM UserService_User WHERE Account LIKE '%111%';

只有確實需要「逐筆執行複雜商業邏輯」時,才考慮迴圈或游標;否則請優先使用集合式 SQL。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved