Хранимая процедура, которая содержит временную таблицу и курсор не работает - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно получить иерархию некоторых проектов во временной таблице, потому что проект, для которого создана иерархия, зависит от триггера после обновления.Поэтому мне нужно вставить результат хранимой процедуры во временную таблицу.После этого мне нужен курсор, чтобы зациклить все результаты и после этого сделать некоторые обновления.Вот мой код ... Я не знаю почему, но он не входит в цикл, или я так думаю.

ALTER PROCEDURE [dbo].[UPDATE_UDF_VALUES_HIERARCHY] ( 
                @proj_id INT
                                                    ) 
AS
    BEGIN
        DECLARE @tmpHierarchy TABLE ( 
                                    proj_id       INT , 
                                    parent_wbs_id INT
                                    );

        DECLARE @projid INT , @parent_wbs_id INT , @Total INT , @Totaltest INT;
        INSERT INTO @tmpHierarchy ( proj_id , parent_wbs_id
                                  ) 
        EXEC GetHierarchyForProject @proj_id;

        --INSERT INTO @tmpHierarchy
        --Exec GetHierarchyForProject @proj_id
        -- to break the match in all scanora

        UPDATE udfvalue
               SET udf_number = ( SELECT SUM(udf_number)
                                  FROM UDFVALUE
                                  WHERE udf_type_id = 1
                                        AND 
                                        proj_id = @proj_id
                                )
        WHERE udf_type_id = 2
              AND 
              proj_id = @proj_id;

        DECLARE db_cursor_hierarchy_andreea CURSOR

        FOR SELECT *
            FROM @tmpHierarchy;

        OPEN db_cursor_hierarchy_andreea;

        FETCH NEXT FROM db_cursor_hierarchy_andreea INTO @projid , @parent_wbs_id;

        IF @proj_id != @projid
            BEGIN
                IF EXISTS ( SELECT proj_id
                            FROM udfvalue
                            WHERE proj_id = @projid
                                  AND 
                                  udf_type_id = 2
                          ) 
                    BEGIN
                        WHILE @@FETCH_STATUS = 0
                            BEGIN
                                SELECT @Totaltest = SUM(udf_number)
                                FROM udfvalue
                                WHERE udf_type_id = 2
                                      AND 
                                      fk_id IN ( SELECT proj_id
                                                 FROM PROJWBS
                                                 WHERE parent_wbs_id = ( SELECT wbs_id
                                                                         FROM projwbs
                                                                         WHERE proj_id = @projid
                                                                       )
                                               );
                                UPDATE udfvalue
                                       SET udf_number = @Totaltest
                                WHERE udf_type_id = 2
                                      AND 
                                      proj_id = @projid;
                            END;
                    END;
                FETCH NEXT FROM db_cursor_hierarchy_andreea INTO @projid , @parent_wbs_id;

        END;
        CLOSE db_cursor_hierarchy_andreea;
        DEALLOCATE db_cursor_hierarchy_andreea;
    END;

1 Ответ

0 голосов
/ 03 апреля 2019

Ваш @projid не инициализирован и поэтому null. Таким образом, когда вы выполняете if @proj_id!=@projid всегда возвращает false, поэтому вы никогда не входите в цикл.

Перед if обязательно сделайте что-то вроде SET @projid = -1.

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