首先尝试游标,这样就很容易= 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
)
答案 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)
或者,我们需要了解更多关于插入记录的逻辑。