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;