游标返回1个额外记录

时间:2015-09-03 13:34:15

标签: sql sql-server tsql

I have a legacy code which used a Table called MyTable which **has only 6 records**.

Here is SQl code:

USe MyDatabase
GO

DECLARE @ANubmer as  Varchar(100)
DECLARE @BNumber as Varchar(100)


DECLARE MyCursor  CURSOR FOR
SELECT Anumber,BNumber
 FROM MyTable
 ORDER BY 
 s.ANumber,date1

OPEN SurveyCursor
FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber

 select 'CID='+@ANumber+' Avatar='+ @BNubmer


WHILE @@FETCH_STATUS = 0
BEGIN

 FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber                   

 select 'CID='+@ANumber+' Avatar='+ @BNubmer
END

问题在于代码返回7行。

2 个答案:

答案 0 :(得分:6)

把第二个' FETCH'在'下方选择'循环中的语句。 从本质上讲,它应该是'中的最后一句话。循环。

同样......抛弃第一个选择语句。你应该把所有东西放在一个循环中。

抓取 - >而 - >选择 - >取

  WHILE @@FETCH_STATUS = 0
    BEGIN



     select 'CID='+@ANumber+' Avatar='+ @BNubmer

     FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber
    END

更正完整脚本

USe MyDatabase
GO

DECLARE @ANubmer as  Varchar(100)
DECLARE @BNumber as Varchar(100)


DECLARE MyCursor  CURSOR FOR
SELECT Anumber,BNumber
 FROM MyTable
 ORDER BY 
 s.ANumber,date1

OPEN SurveyCursor
FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber


WHILE @@FETCH_STATUS = 0
BEGIN


 select 'CID='+@ANumber+' Avatar='+ @BNubmer


 FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber 
END

建议的优化

  • 使用GOTO的一个提取语句
  • 关闭/取消分配

    USe MyDatabase
    GO
    
    DECLARE @ANubmer as  Varchar(100)
    DECLARE @BNumber as Varchar(100)
    
    
    DECLARE MyCursor  CURSOR FOR
    SELECT Anumber,BNumber
     FROM MyTable
     ORDER BY 
     s.ANumber,date1
    
    OPEN SurveyCursor
    
    GOTO FetchNext;
    
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
    
     select 'CID='+@ANumber+' Avatar='+ @BNubmer
    
    FetchNext:
     FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber 
    END
    
    CLOSE MyCursor
    DEALLOCATE MyCursor
    

答案 1 :(得分:1)

为什么不简单地执行Select,它将返回游标返回的确切内容,但速度会快得多。

一个简单的选择看起来像......

select 'CID='+ CAST(Anumber AS VARCHAR(100)) + ' Avatar='+ CAST(BNumber  AS VARCHAR(100)) 
FROM MyTable
ORDER BY ANumber , date1

为了处理空值,我会做类似的事情......

select 'CID='   + CAST(ISNULL(Anumber,'No value') AS VARCHAR(100)) 
    + ' Avatar='+ CAST(ISNULL(BNumber,'No value') AS VARCHAR(100)) 
FROM MyTable
ORDER BY ANumber , date1