2011-07-28 60 views
0

第一次嘗試遊標,所以很簡單= 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 
) 
+6

你不需要使用遊標。儘可能避免它們。 –

+3

@米奇是對的。避免使用遊標,除了特別的問題之外。它們速度很慢,耗費大量資源,並可能很快導致僵局。 –

+0

Ty尋求建議。然而,這只是我用來學習它們的一個藉口。考慮到這一點,問題是什麼? –

回答

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 
2

我beieve你的邏輯是錯誤的(這有點隱蔽,因爲使用光標的!)。

您的發佈代碼試圖插入一行到COI.Workflow的每一行COI.Workflow次符合您的第一個選擇的條件的公司數量。 (注意你的插入的SELECT語句沒有任何條件:你正在選擇整個表)。在每次循環中,您的行數加倍COI.Workflow

因此,它不是無限的,但它可能非常非常長!

我建議你重寫爲基於集合的語句,邏輯將變得更清晰。

2

您正在工作流表中爲每次迭代插入所有工作流記錄的新副本,因此每次都會將其大小加倍。例如,如果您的光標中包含30個項目,則最終的工作流程表格將比以前增加1073741824倍以上的記錄。

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) 

或者,我們需要更多地瞭解你的插入記錄的邏輯。