2013-02-08 42 views
0

我有一個包含多個問卷的數據庫,每個問卷都有相關的(多選)問題,每個問題都有相關的答案。循環在SQL存儲過程中不起作用

我正在嘗試創建一個存儲過程,它將刪除所有問題和僅包含調查問卷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 [email protected] 

    END 

    CLOSE questionCursor 

     -- this works fine, the questions are being deleted 
    DELETE FROM questions WHERE [email protected] 

END 

相關的問題被刪除,但相關答案不是,所以我做錯事在我的循環,是沒有人在那裏誰看到它是什麼?

在此先感謝

+0

切換取回和刪除可能有幫助嗎? – Mr47 2013-02-08 15:27:52

+2

你知道這不是正確的做法,對吧?您只需編寫一個刪除語句即可刪除答案,並將其加入要刪除的結果而不是使用遊標。 'DELETE FROM FROM FROM a answers a JOIN questions q on a.QuestionID = q.ID WHERE q.EnqueteID = @ EnqueteID' – cjk 2013-02-08 15:55:33

回答

2

你的光標是有點奇怪,在FETCH NEXT通常是循環的最後聲明(見從documentation的例子),所以其實你取的第一個值的第二個被立即更換。將一些PRINT語句添加到遊標中以檢查當前值@QID會顯示此內容。

但真正的答案是不使用光標的話,那是在這裏沒有必要:

delete from dbo.answers where questionid in (
    select questionid from dbo.questions where EnqueteID = @EnqueteID 
) 
delete from dbo.questions where EnqueteID = @EnqueteID 
+0

Thanks Pondfile!這顯然是最好的解決方案。 – Michiel 2013-02-11 12:39:03

1

整體光標看起來不錯。我會在結束之前將提取語句(在循環內)移動到右下角。目前,您正在將第一個值讀入參數,然後在您進入循環後立即獲取第二個值;有效地拋出第一個值,而不使用它。

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 [email protected] 

    --Fetch should be right before the loop ends 
    FETCH questionCursor INTO @QID 
END 
1

你取第一,然後第二所以先不被刪除

FETCH questionCursor INTO @QID 

WHILE(@@fetch_status=0) 
BEGIN 

    DELETE FROM answers WHERE [email protected] 
    FETCH questionCursor INTO @QID 

END 

delete answers 
where QuestionID in (select SELECT ID FROM questions WHERE EnqueteID = @EnqueteID); 
go 
delete questions WHERE EnqueteID = @EnqueteID; 
+0

謝謝,這解決了循環問題。我確實使用了Pondfiles解決方案,因爲他說循環在這裏不是必需的。 – Michiel 2013-02-11 12:36:48