SQL SERVER 在存储过程遍历多个结果并执行逻辑的样板代码

2023-09-06  本文已影响0人  吉凶以情迁

@@FETCH_STATUS = 0不等于0 就是不合法的状态,在while之前可以进行判断

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

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

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

    CLOSE cur;
    DEALLOCATE cur;

另外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;
上一篇下一篇

猜你喜欢

热点阅读