0

複数のアンケートを含むデータベースがあり、各アンケートには関連する (複数選択) 質問があり、各質問には関連する回答があります。

アンケートの ID のみを使用して、すべての質問と関連する回答を削除するストアド プロシージャを作成しようとしています。私のストアドプロシージャは次のようになります。

ALTER PROCEDURE [dbo].[DeleteQuestionnnaire] 

    @EnqueteID bigint
AS

BEGIN
    SET NOCOUNT ON

    DECLARE @QID bigint

    DECLARE questionCursor CURSOR FOR
        SELECT ID FROM questions WHERE EnqueteID = @EnqueteID

    OPEN questionCursor;

    FETCH questionCursor INTO @QID  

    WHILE(@@fetch_status=0)
    BEGIN

    -- this is not working correct, the related answers are NOT being deleted

        FETCH questionCursor INTO @QID
        DELETE FROM answers WHERE QuestionID=@QID

    END

    CLOSE questionCursor

        --  this works fine, the questions are being deleted
    DELETE FROM questions WHERE EnqueteID=@EnqueteID

END

関連する質問は削除されていますが、関連する回答は削除されていないため、ループで何か間違ったことをしています。それが何であるかを見ている人はいますか?

前もって感謝します

4

3 に答える 3

1

最初のフェッチを行ってから2番目のフェッチを行うため、最初のフェッチは削除されません。

FETCH questionCursor INTO @QID  

WHILE(@@fetch_status=0)
BEGIN

    DELETE FROM answers WHERE QuestionID=@QID
    FETCH questionCursor INTO @QID

END

また

delete answers 
where QuestionID in (select SELECT ID FROM questions WHERE EnqueteID = @EnqueteID);
go
delete questions WHERE EnqueteID = @EnqueteID;
于 2013-02-08T15:58:08.587 に答える
1

全体的なカーソルは見栄えがします。fetch ステートメント (ループ内) を最後の直前の右下に移動します。現在、最初の値をパラメーターにフェッチしてから、ループに入るとすぐに 2 番目の値をフェッチしています。最初の値を使用せずに効果的に破棄します。

WHILE(@@fetch_status=0)
BEGIN

    --SELECT @QID and Answers to see if you're getting the right values
    SELECT @QID
    SELECT * FROM Answers WHERE QuestionID = @QID
    -- DELETE FROM answers WHERE QuestionID=@QID

    --Fetch should be right before the loop ends
    FETCH questionCursor INTO @QID   
END
于 2013-02-08T15:42:18.490 に答える