繁体   English   中英

包含临时表和游标的存储过程不起作用

[英]Stored procedure that contains a temporary table and a cursor doesn't work

我需要在临时表中获得某些项目的层次结构,因为构建层次结构的项目取决于更新后的触发器。 所以我需要在临时表中插入存储过程的结果。 之后,我需要一个游标,以循环throgh所有结果,然后进行一些更新。 这是我的代码..我不知道为什么,但它没有进入循环,或者这就是我的想法。

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;

您的@projid未初始化,因此它为null 所以,当你执行if @proj_id!=@projid总是返回false,所以你永远不会进入循环。

if之前确保执行SET @projid = -1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM