Я использую курсор для извлечения строк из временной таблицы, но в противном случае, если условие не работает, это хороший подход для выполнения задач такого типа на MSSQL? - PullRequest
0 голосов
/ 12 июня 2019

у меня есть временная таблица с идентификатором записи, идентификатором модуля и идентификатором состояния, теперь я должен проверять каждую строку этой временной таблицы и в соответствии с @levelid обновлять соответствующую таблицу с этим идентификатором состояния, но приведенный ниже код никогда не переходит к другому, если условие, я новичок в mssql и ищу ваши ценные ответы:)

DECLARE @MyCursor CURSOR; 
DECLARE @LevleId INT, 
        @STATUS  VARCHAR(max), 
        @RECID   VARCHAR(max); 

BEGIN 
    SET @MyCursor = CURSOR 
    FOR SELECT TOP 1000 level_id, 
                        status_id, 
                        record_id 
        FROM   #temp_record_id_typ2 
        WHERE  approval_typ_id = 2 

    OPEN @MyCursor 

    FETCH next FROM @MyCursor INTO @LevleId, @STATUS, @RECID 

    WHILE @@FETCH_STATUS = 0 
      BEGIN 
          IF ( @LevleId = 1 
               AND @STATUS != 3 ) 
            BEGIN 
                SELECT @Update_Typ2_Rec = N'UPDATE hrms_approvals  SET approval_status_id = ' +
                       @STATUS 
                         + ' WHERE record_id = ' + @RECID 
                         + ' AND module_id = ' + @Module_id + 
                       ' '; 

                --SELECT @Update_Typ2_Rec 
                EXECUTE Sp_executesql 
                  @Update_Typ2_Rec; 

                SELECT @UPDATE_MODULE_TABLE = N'UPDATE ' + @TableName + 
                                              '  SET approval_status_id = 9  WHERE id = ' 
                                              + @RECID + ''; 

                --SELECT @UPDATE_MODULE_TABLE 
                EXECUTE Sp_executesql 
                  @UPDATE_MODULE_TABLE; 

                PRINT 'LevleId = 1' 
            END 
          ELSE IF ( @LevleId = 2 
               AND @STATUS != 3 ) 
            BEGIN 
                SELECT @Update_Typ2_Rec = 
                       N'UPDATE hrms_approvals  SET approval_status_id = ' 
                       + @STATUS + ' WHERE record_id = ' 
                       + @RECID + ' AND module_id = ' 
                       + @Module_id + ' '; 

                --SELECT @Update_Typ2_Rec 
                EXECUTE Sp_executesql 
                  @Update_Typ2_Rec; 

                SELECT 
            @UPDATE_MODULE_TABLE = N'UPDATE ' + @TableName 
                                   + '  SET approval_status_id = 10  WHERE id = ' + @RECID + ''; 

                --SELECT @UPDATE_MODULE_TABLE 
                EXECUTE Sp_executesql 
                  @UPDATE_MODULE_TABLE; 

                PRINT 'LevleId = 2' 
            END 
          ELSE IF ( @LevleId = 3 
               AND @STATUS != 3 ) 
            BEGIN 
                SELECT @STATUS, 
                       @LevleId 

                PRINT 'LevleId = 3' 
            END 
          ELSE IF ( @LevleId = 4 
               AND @STATUS != 3 ) 
            BEGIN 
                SELECT @STATUS, 
                       @LevleId 

                PRINT 'LevleId = 4' 
            END 
          ELSE IF ( @LevleId = 5 
               AND @STATUS != 3 ) 
            BEGIN 
                SELECT @STATUS, 
                       @LevleId 

                PRINT 'LevleId = 5' 
            END 

          FETCH next FROM @MyCursor INTO @LevleId, @STATUS, @RECID 
      END; 

    CLOSE @MyCursor; 

    DEALLOCATE @MyCursor; 
END; 

1 Ответ

0 голосов
/ 12 июня 2019

Попробуйте этот код ниже, Вы не объявили эти параметры " @ TableName и @ ModuleId ", проверьте свой код и присвойте значение для @TableName и @ModuleId

Declare @Counter int=1
        ,@Tot_Count int=0
        ,@LevleId int 
        ,@Status int
        ,@RecId int
        ,@Module_id int
        ,@TableName varchar(30)=''

Create Table #Temp_Table
(
    Id int identity(1,1)
    ,level_id int
    ,status_id int
    ,record_id int
    ,Module_id int
)

Insert into #Temp_Table
(
    level_id,status_id,record_id
)
 Select level_id
        ,status_id
        ,record_id 
        ,Module_id
   from #temp_record_id_typ2
  where approval_typ_id = 2 

Select @Tot_Count=Count(1) from #Temp_Table

While @Tot_Count >= @Counter
Begin

         Select @LevleId=level_id 
                ,@Status=status_id
                ,@RecId=record_id
                ,@Module_id=Module_id
           from #Temp_Table
          where Id=@Counter

          IF ( @LevleId = 1 AND @STATUS <> 3 ) 
            BEGIN 

                Exec
                ('
                     UPDATE hrms_approvals  
                        SET approval_status_id = ' + @STATUS + ' 
                      WHERE record_id = ' + @RECID + ' 
                        AND module_id = ' + @Module_id +' 

                     UPDATE '+ @TableName +'  
                        SET approval_status_id = 9  
                      WHERE id = '+ @RECID + '
                ') 

                PRINT 'LevleId = 1' 
            END
            ELSE IF ( @LevleId = 3 AND @STATUS <> 3 ) 
            BEGIN 
                    SELECT  @STATUS, 
                            @LevleId 

                    PRINT 'LevleId = 3' 
            END 
            ELSE IF ( @LevleId = 4 AND @STATUS <> 3 ) 
            BEGIN 
                    SELECT @STATUS, 
                           @LevleId 

                    PRINT 'LevleId = 4' 
            END 
            ELSE IF ( @LevleId = 5 AND @STATUS <> 3 ) 
            BEGIN 
                    SELECT @STATUS, 
                           @LevleId 

                    PRINT 'LevleId = 5' 
            END 

         Set @Counter+=1

End

Drop table #Temp_Table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...