在 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
WHILE 條件 BEGIN ... END,不可寫成 END WHILE。DECLARE @var TYPE = 初值 初始化語法 (2008+ 完整支援,2005 部分支援,建議分行 SET)。EXEC 另一個_SP @參數,多參數以逗號分隔。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。