简书链接:SQLSERVER在存储过程遍历多个结果并执行逻辑的样板代码
文章字数:267,阅读全文大约需要1分钟

1
2
3
4
5
6
7

0:表示游标成功检索到一行数据。在游标中有更多的数据行可用。

-1:表示游标没有检索到更多的数据行,游标已经到达了结果集的末尾。在此状态下,通常不应再尝试使用 FETCH NEXT。

-2:表示在 FETCH 语句中指定的游标或结果集不存在。这通常是由于游标或结果集已经关闭或不存在的情况下引发的。

CLOSE cur;
DEALLOCATE cur;
1
2
3
4
另外```    WHILE @@FETCH_STATUS = 0```后面要紧接着填写BEGIN,否则死循环

``` FETCH NEXT FROM cur INTO ```的总数要和select总数相等。

CREATE PROCEDURE [dbo].[XXX]
@WorkerID INT,
@CheckSumQty INT OUTPUT,
AS
BEGIN
SET NOCOUNT ON;

-- 声明游标
DECLARE @ToWHID INT;
DECLARE @PartNo NVARCHAR(50);
DECLARE @InvCheckID INT;
DECLARE @MinPackMtNo INT;

-- 创建游标并打开
DECLARE cur CURSOR FOR
SELECT micb.ToWHID, micb.PartNo
FROM A
OPEN cur;

-- 初始化变量
FETCH NEXT FROM cur INTO @ToWHID, @PartNo;

-- 循环处理每一行
WHILE @@FETCH_STATUS = 0
BEGIN
    -- 执行存储过程并传递参数
    DECLARE @RC INT;
    EXEC @RC = [dbo].[XXXX]
   
        @PartNo = @PartNo,
        @ToWHID = @ToWHID,
        @WorkerID = @WorkerID,
        @CheckSumQty = @CheckSumQty OUTPUT,

    -- 处理存储过程返回的结果(如果需要)

    -- 获取下一行
    FETCH NEXT FROM cur INTO @ToWHID, @PartNo
END;

-- 关闭游标并释放资源
CLOSE cur;
DEALLOCATE cur;

-- 返回结果(如果需要)

END;