奇怪的SQL游标行为

时间:2015-09-22 12:09:34

标签: sql sql-server tsql

enter code here我有一个光标(腌制旧代码),如下所示:

DECLARE MYCursor  CURSOR FOR
SELECT ANumber,CNumber,Login_Name,S_Date,
 FROM MyTable 
 ORDER BY ANumber, S_Date 

当我只运行SQL

SELECT ANumber,CNumber,Login_Name,S_Date,
     FROM MyTable 
     ORDER BY ANumber, S_Date 

我按预期获得数据,顶部有较旧的日期。

当我运行游标时,我得到所有行,但是将更新的日期放在顶部。这是游标以相反的顺序返回项目。

我从Order By

删除了ANumber

我仍然以相反的顺序看到结果:

这是我的完整代码:

DECLARE @ANubmer as  Varchar(100)
DECLARE @BNumber as Varchar(100)
DECLARE @Login_Name as Varchar(100)
DECLARE @S_Date as datetime

 DECLARE MYCursor  CURSOR FOR
    SELECT ANumber,BNumber,Login_Name,S_Date,Evaluator_ID,Evaluator_Date
     FROM MyTable 
     ORDER BY  S_Date 

OPEN MyCursor

FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber,@Login_Name,@S_DT,@Evaluator_ID,@Evaluator_Date

WHILE @@FETCH_STATUS = 0
BEGIN

IF @Login_Name='ABC'
    BEGIN
            IF @Evaluator_ID is null AND @Evaluator_Date is null     
            UPDATE tblb
            SET Evaluator_ID=@Login_Name,
                Evaluator_Date=@S_DT
            WHERE ACIDNumber=@ACIDNumber            
    END


FETCH NEXT FROM MyCursor INTO @ANubmer, @BNumber,@Login_Name,@S_DT,@Evaluator_ID,@Evaluator_Date

END

CLOSE MyCursor
DEALLOCATE MyCursor

核心逻辑是evaluator_Date中的mytable为空,更新

  

tblb 最早 S_Date

tblb获取日期更新,但顺序相反!

在此运行之后,值进入tblb但不是预期的方式:

例如,如果以下值在MyTable中:

 ANumber BNumber Login_Name S_Date        Evaluator_id   Evaluator_Date
  1        2       ABC       1/11/2015      Null           Null

  1        2       ABC       1/12/2015      Null           Null

tblB将被视为:

ANumber BNumber Login_Name S_Date        Evaluator_id   Evaluator_Date
      1        2       ABC       1/12/2015      ABC         1/12/2015

1 个答案:

答案 0 :(得分:-1)

如果您还没有设法解决问题,请尝试首先使用Order By子句将select插入临时表。

SELECT DATA1, DATA2 INTO #TEMP_TABLE FROM ORG_TABLE ORDER BY 1, 2

使用此临时表顺序,声明光标:

DECLARE MYCursor CURSOR FOR
SELECT ANumber, CNumber, Login_Name, S_Date
FROM #TEMP_TABLE