光标卡在无限循环中

时间:2011-07-28 23:40:31

标签: sql-server cursor

首先尝试游标,这样就很容易= P游标应该抓住一个伞形组下的公司ID列表。然后定位特定公司并将其工作流记录复制到光标中的公司。

它无限地将这些工作流程记录插入所有公司......这里的问题是什么?

n00b的错误在哪里?

DECLARE @GroupId int = 36;
DECLARE @CompanyToCopy int = 190
DECLARE @NextId int;
Declare @Companies CURSOR;

SET @Companies = CURSOR FOR 
SELECT CompanyId
FROM Company C 
    INNER JOIN [Group] G 
        ON C.GroupID = G.GroupID
WHERE   C.CompanyID != 190 
        AND
        G.GroupId = @GroupId
        AND
        C.CompanyID != 0

OPEN @Companies
FETCH NEXT
FROM @Companies INTO @NextId

WHILE (@@FETCH_STATUS = 0)
BEGIN

    INSERT INTO COI.Workflow(CompanyID, EndOfWorkflowAction, LetterType, Name)
    (SELECT 
            @NextId,
            W.EndOfWorkflowAction,
            W.LetterType,
            W.Name
     FROM COI.Workflow W)

    FETCH NEXT
    FROM @Companies INTO @NextId
END
CLOSE @Companies;
DEALLOCATE @Companies;

编辑:

我决定尝试制作这个套装只是因为在被告知要做之后......我意识到我并没有真正得到如何将其作为基于集合的查询的答案。

感谢所有人的帮助。我将为后代发布基于集合的版本。

INSERT INTO COI.Workflow(CompanyID, EndOfWorkflowAction, LetterType, Name)
(
SELECT 
    CG.CompanyId,
    W.EndOfWorkflowAction,
    W.LetterType,
    W.Name
FROM COI.Workflow W
     CROSS JOIN (SELECT C.CompanyID
                 FROM Company C 
                    INNER JOIN [Group] G
                        ON G.GroupID = C.GroupID
                 WHERE  C.CompanyID != 190 
                        AND 
                        C.CompanyID != 0
                        AND 
                        G.GroupID = 36
                 ) AS CG
 WHERE W.CompanyID = 190
 )

4 个答案:

答案 0 :(得分:3)

你没有WHERE条件:

SELECT 
            @NextId,
            W.EndOfWorkflowAction,
            W.LetterType,
            W.Name
     FROM COI.Workflow W
     -- WHERE CompanyID = @CompanyToCopy -- This should be here

所以你得到了一种倍增效果。

initial state, company 190, seed row (0)

pass one, company 2, copy of seed row (1)
now 2 rows

pass two, company 3, copy of seed row (0) - call this (2)
pass two, company 3, copy of copy of seed row (1) - call this (3)
now 4 rows

then 8 rows, etc

答案 1 :(得分:2)

我认为你的逻辑是错误的(由于使用了游标,它有点隐藏!)。

您发布的代码正在尝试在COI.Workflow中为COI.Workflow中的每一行插入一行,以及与您的第一个选择条件匹配的公司数量。 (注意插入的SELECT语句没有条件:你正在选择整个表)。在每次循环中,您将COI.Workflow

中的行数加倍

所以,它不是无限的,但它可能非常非常长!

我建议你重写为基于集合的语句,逻辑会更清晰。

答案 2 :(得分:2)

您正在为每次迭代在工作流表中插入所有工作流记录的新副本,因此每次都会将其大小加倍。例如,如果您的光标中有30个项目,那么最终会得到一个工作流程表,其记录数比以前多1073741824倍。

答案 3 :(得分:0)

首先使用游标是OK,INSERT中的所有问题...... SELECT逻辑。 我无法理解您需要在COI.Workflow表中插入什么内容。 我同意之前的评论,即您当前的WHERE条件会使记录翻倍,但我不相信您希望每次都为每个公司插入完整的双重记录。 所以,我认为你需要像

这样的东西
INSERT INTO COI.Workflow(CompanyID, EndOfWorkflowAction, LetterType, Name)
(SELECT TOP 1
        @NextId,
        W.EndOfWorkflowAction,
        W.LetterType,
        W.Name
 FROM COI.Workflow W)

或者,我们需要了解更多关于插入记录的逻辑。