游标不循环所有记录
Cursor Not looping all the Records
我创建了一个带有游标的存储过程来循环遍历 table,其中包含以下记录:
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
之后,你这样做:
SET @lineNo = @lineNo + 1;
并且您永远不会将 @lineNo
设置回零,因此当光标循环返回时,IF 条件不再为真,因此其块中的 none 内容已完成。
我创建了一个带有游标的存储过程来循环遍历 table,其中包含以下记录:
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
之后,你这样做:
SET @lineNo = @lineNo + 1;
并且您永远不会将 @lineNo
设置回零,因此当光标循环返回时,IF 条件不再为真,因此其块中的 none 内容已完成。