Курсор застрял в бесконечном цикле - PullRequest
0 голосов
/ 29 июля 2011

Первая попытка курсора, так что успокойтесь = P Курсор должен захватить список идентификаторов компаний, которые все находятся в зонтичной группе.Затем настройте таргетинг на конкретную компанию и скопируйте ее записи рабочего процесса в компании в курсоре.

Он бесконечно вставляет эти записи рабочего процесса во все компании ... в чем здесь проблема?

Где ошибка 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 ]

3 голосов
/ 29 июля 2011

У вас нет условия ГДЕ:

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 голосов
/ 29 июля 2011

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

2 голосов
/ 29 июля 2011

Я считаю, что ваша логика неверна (она несколько скрыта из-за использования курсора!).

Ваш опубликованный код пытается вставить строку в COI.Workflow для каждой строки в COI.Workflow умноженном на количество компаний, соответствующих условиям вашего первого выбора. (Обратите внимание, что оператор SELECT вашей вставки не имеет условия: вы выбираете всю таблицу). При каждом прохождении цикла вы удваиваете количество строк в COI.Workflow

Итак, это не бесконечно, но вполне может быть очень, очень долго!

Я предлагаю вам переписать как оператор, основанный на множестве, и логика станет понятнее.

0 голосов
/ 29 июля 2011

Первое использование курсора в порядке, все проблемы в логике 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)

Или нам нужно больше узнать о вашей логике вставки записей.

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