【问题标题】:If-Else Condition inside cursor not working游标内的 If-Else 条件不起作用
【发布时间】:2012-03-29 09:02:07
【问题描述】:

我有一个程序,我需要检查其他服务器中存在的表中的状态并需要更新它。

这是我的存储过程..请检查

ALTER PROCEDURE [dbo].[testproceudre]    
AS       
DECLARE @Status INT     
DECLARE @UpdatedDateTime DATETIME    
DECLARE @STSFLG INT    
--dynamic query variables       

DECLARE @SQLString NVARCHAR(4000)     
DECLARE @ParmDefinition NVARCHAR(4000)     
DECLARE @DBSTRING VARCHAR(1000)     
DECLARE @TABLESTR VARCHAR(200)       
BEGIN     

 SET @DBSTRING = '[server name].[db name]'        
 SET @TABLESTR = ''     

 DECLARE @SYSproUploadflag INT    
 DECLARE @DpCodeExist INT    

 SET @SYSproUploadflag = 0     
 SET @DpCodeExist = 0     
 SET @TABLESTR = @DBSTRING+'.[dbo].[otherservertablename]'     
 SET @ParmDefinition = N'@Status INT,@UpdatedDateTime DATETIME'    
 SET @SQLString ='SELECT StatusFlg,ConfirmedDate FROM localtablename
 JOIN '+ @TABLESTR +' ON     
 IssuesId=SFAIssueId WHERE Statusflg=4'     

 EXECUTE sp_executesql     
 @SQLString,     
 @ParmDefinition,     
 @Status = @Status,     
 @UpdatedDateTime = @UpdatedDateTime     
 BEGIN     
     ------------------------------------------------------------------------  
  IF @SYSproUploadflag = 0     
  BEGIN  
   DECLARE PARKCURSOR CURSOR FOR 
   SELECT STATUS FROM [server name].[db name].[dbo].[otherservertablename]
   JOIN localtablename ON SFAISSUEID = ISSUESID
   OPEN  PARKCURSOR
   FETCH NEXT FROM PARKCURSOR 
   INTO @STSFLG
   WHILE (@@FETCH_STATUS = 0)
   BEGIN
        IF(@STSFLG = 3)
        BEGIN
           UPDATE issue2 SET status = 4,UpdatedDateTime=ConfirmedDate,
           SOURCEOFUPDATION = 'SFA'     
           FROM [server name].[db name].[dbo].[otherservertablename] issue2  JOIN     
           tblAHCIssues issue1    
           ON issue2.sfaissueid=issue1.issuesid 
        END
        IF(@STSFLG = 2)
        BEGIN
           UPDATE issue2 SET status = 7,UpdatedDateTime=ConfirmedDate,
           SOURCEOFUPDATION = 'SFA'     
           FROM [server name].[db name].[dbo].[otherservertablename] issue2  JOIN     
           localtablename issue1    
           ON issue2.sfaissueid=issue1.issuesid  
        END  
        FETCH NEXT FROM PARKCURSOR INTO  @STSFLG 
   END
    CLOSE PARKCURSOR 
    DEALLOCATE PARKCURSOR 
  END     
 END        
END     

我的问题是,如果所有行的状态都是 2,它会更新为 7 如果所有行中有 3 则更新为 4 但是如果有些是 3,有些是 2,那么第一行是什么,就这一点而言,它只会更新所有值。这意味着如果第一行的状态为 3,第二行的状态为 2,则两者都更新为4.但它应该首先更新为 4,然后更新为 7.任何人都可以帮助我我在做什么错误???

【问题讨论】:

    标签: sql sql-server-2005 stored-procedures


    【解决方案1】:

    您的更新中没有 where 子句 - 每个更新都将更新完全相同的行集(即 issue2 中的所有那些在 localtablename 中存在匹配问题的行)。

    这意味着最终结果将取决于光标中的最后一个状态 ID。

    【讨论】:

      猜你喜欢
      • 2018-10-16
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 2011-12-27
      • 2020-04-05
      • 2019-05-03
      相关资源
      最近更新 更多