カーソルを最初に試してみましょう。簡単に取りましょう= 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
)
カーソルを使用する必要はありません。可能な限り避けてください。 –
@Mitchが正しいです。特別なものを除いてすべてのものにカーソルを使用しないでください。彼らは遅く、多量のリソースを消費し、すぐにデッドロックにつながる可能性があります。 –
Tyさんにアドバイスをお願いします。しかし、これは私がそれらを学ぶための口実として使用している単なる工夫された問題です。それを念頭に置いて、問題は何ですか? –