Sql 游标未循环所有记录
我创建了一个存储过程,其中有一个游标在一个表中循环,该表包含以下记录:Sql 游标未循环所有记录,sql,sql-server,loops,stored-procedures,cursor,Sql,Sql Server,Loops,Stored Procedures,Cursor,我创建了一个存储过程,其中有一个游标在一个表中循环,该表包含以下记录: MTR EGA ---------------- NULL 110 NULL 111 NULL 121 NULL 130 NULL 140 NULL 150 1303330015 130 但是光标只打印第一条记录NULL 110,它不会循
MTR EGA
----------------
NULL 110
NULL 111
NULL 121
NULL 130
NULL 140
NULL 150
1303330015 130
但是光标只打印第一条记录NULL 110,它不会循环遍历所有记录
ALTER PROCEDURE [dbo].[RECEV_Manual]
DECLARE @FROMDATE DATETIME
DECLARE @TODATE DATETIME
DECLARE @COMPANY INT
DECLARE @DIVISION VARCHAR(100)
DECLARE @DOCTYPE VARCHAR(10) = '5';
DECLARE @CONO INT = 1000;
DECLARE @DocType1 VARCHAR(20) = 'Y4';
SET @FROMDATE = CONVERT(VARCHAR, GETDATE() - 30, 111)
SET @TODATE = CONVERT(VARCHAR, GETDATE(), 111)
SET @COMPANY = 1000
SET @DIVISION = '110'
CREATE TABLE #Temp1
(
......
)
CREATE TABLE #Temp2
(
......
)
INSERT INTO #Temp1....
INSERT INTO #Temp2....
SELECT DISTINCT MTR, EGA
INTO #MTRS
FROM #Temp2
/* Table #MTRS Values....
MTR EGA
------------------
NULL 110
NULL 111
NULL 121
NULL 130
NULL 140
NULL 150
1303330015 130
.......*/
DECLARE @docNo VARCHAR(50);
DECLARE @partner VARCHAR(50);
DECLARE @docCount INT = (SELECT COUNT(DISTINCT MTR)
FROM #Temp1); --This prints 1
DECLARE @lineNo INT = 0;
DECLARE lineCursor CURSOR FOR
SELECT DISTINCT MTR, EGA
FROM #MTRS
OPEN lineCursor;
FETCH NEXT FROM lineCursor INTO @docNo, @partner
WHILE @@FETCH_STATUS = 0
BEGIN
IF @lineNo < @docCount
BEGIN
PRINT @lineNo -- prints 0
PRINT @docCount -- prints 1
SET @lineNo = @lineNo + 1;
PRINT @docNo -- prints empty
PRINT @partner -- prints 110
DECLARE @DIVI VARCHAR(50);
DECLARE @VONO VARCHAR(50);
SET @DIVI = (SELECT TOP 1 DIVI
FROM #Data);
SET @VONO = (SELECT TOP 1 VONO
FROM #Data);
DECLARE @count INT = (SELECT COUNT(*)
FROM [data]
WHERE VONO = @VONO
AND MTR = @docNo)
PRINT @count --prints 0
IF @count = 0
BEGIN
PRINT @docNo --prints empty
PRINT @partner -- prints 110
--Do stuff--
END
END
FETCH NEXT FROM lineCursor INTO @docNo, @partner
END
CLOSE lineCursor;
DEALLOCATE lineCursor;
END
光标只打印一次,因为这仅为一次:
IF @lineNo < @docCount
而且您从未将@lineNo设置回零,因此当光标循环回零时,IF条件不再为true,因此其块中的所有内容都不会完成。光标只打印一次,因为这只为true一次:
IF @lineNo < @docCount
而且您从未将@lineNo设置回零,因此当光标返回时,IF条件不再为真,因此其块中的所有内容都无法完成。更好的问题是,为什么要使用光标?游标几乎总是被错误地使用,我怀疑你是否真的需要一个。你到底想在这里实现什么?@Larnu实际上在-做一些事情-我创建另一个临时表Temp3并根据所选记录更新其值,然后使用Temp3值和所选光标值为4个不同的表插入值。为什么这意味着你需要一个光标?单次插入可以插入1行或多行。这4种不同的插入几乎肯定可以通过基于集合的逻辑来完成,而不是通过折磨行来完成RBAR行。更好的问题是,为什么要使用光标?游标几乎总是被错误地使用,我怀疑你是否真的需要一个。你到底想在这里实现什么?@Larnu实际上在-做一些事情-我创建另一个临时表Temp3并根据所选记录更新其值,然后使用Temp3值和所选光标值为4个不同的表插入值。为什么这意味着你需要一个光标?单次插入可以插入1行或多行。这4种不同的插入几乎可以通过基于集合的逻辑来完成,而不是通过折磨行来完成RBAR行。正如您所说,我在IF条件之前添加了一个集合@lineNo,现在它工作得很好。谢谢。正如你所说,我在IF条件之前添加了一组@lineNo,现在它工作得很好。非常感谢。