解决游标问题

ann*_*nna 4 sql-server cursors sql-server-2008

我有个问题。我正在使用游标。每次获取最后的记录并打印其数据后,光标都会打印一条附加行。要理解我的意思,请考虑以下示例示例:我只想打印有关10个客户的信息。

USE Northwind
GO

DECLARE myCursor CURSOR 
FOR SELECT TOP(10) ContactName FROM Customers
DECLARE @RowNo int,@ContactName nvarchar(30)
SET @RowNo=1
OPEN myCursor
FETCH NEXT FROM myCursor INTO @ContactName
PRINT  LEFT(CAST(@rowNo as varchar) + '      ',6)+'  '+ @ContactName
SET @RowNo=@RowNo+1
SET @ContactName=''
WHILE @@FETCH_STATUS=0
  BEGIN
        FETCH NEXT FROM myCursor INTO @ContactName
        PRINT + LEFT(CAST(@rowNo as varchar) + '      ',6)+'  '+ @ContactName
        SET @RowNo=@RowNo+1
        SET @ContactName=''
  END
CLOSE myCursor
DEALLOCATE myCursor
Run Code Online (Sandbox Code Playgroud)

现在看一下输出:

1       Maria Anders
2       Ana Trujillo
3       Antonio Moreno
4       Thomas Hardy
5       Christina Berglund
6       Hanna Moos
7       Frédérique Citeaux
8       Martín Sommer
9       Laurence Lebihan
10      Elizabeth Lincoln
11      
Run Code Online (Sandbox Code Playgroud)

行号11也已打印。这是游标中的问题还是总是发生?有什么办法不打印此附加数据?谢谢(我使用sql erver 2008)

Luk*_*keH 5

要么...

FETCH NEXT FROM myCursor INTO @ContactName
WHILE @@FETCH_STATUS = 0
BEGIN
    -- do stuff

    FETCH NEXT FROM myCursor INTO @ContactName
END
Run Code Online (Sandbox Code Playgroud)

要么...

WHILE @@FETCH_STATUS = 0
BEGIN
    FETCH NEXT FROM myCursor INTO @ContactName
    IF @@FETCH_STATUS = 0
    BEGIN
        -- do stuff
    END
END
Run Code Online (Sandbox Code Playgroud)

要么...

WHILE (1 = 1)
BEGIN
    FETCH NEXT FROM myCursor INTO @ContactName
    IF @@FETCH_STATUS <> 0
        BREAK

    -- do stuff
END
Run Code Online (Sandbox Code Playgroud)

  • +1,我喜欢“ WHILE(1 = 1)”版本,只有一个“ fetch”,它位于循环的顶部,因此可以使用“ CONTINUE” (2认同)