Условие If-Else внутри курсора не работает - PullRequest
1 голос
/ 29 марта 2012

У меня есть процедура, в которой мне нужно проверить статус в таблице, которая присутствует на другом сервере, и мне нужно обновить ее.

Вот моя хранимая процедура .. пожалуйста, проверьте

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, то первая строка, которая существует, в отношении этого только обновляет все значения. Это означает, что если 1-я строка имеет статус 3 и вторая строка как 2, она обновляет оба 4.но оно должно обновляться сначала как 4, а потом как 7. Может ли кто-нибудь помочь мне, какую ошибку я делаю ???

1 Ответ

7 голосов
/ 29 марта 2012

В вашем обновлении нет предложения where - каждое из этих обновлений будет обновлять один и тот же набор строк (т. Е. Все эти строки в Issue2, где в localtablename существует совпадающая проблема).конечный результат будет зависеть от того, какой последний идентификатор статуса был у вашего курсора.

...