Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 循环在SQL存储过程中不起作用_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql server 循环在SQL存储过程中不起作用

Sql server 循环在SQL存储过程中不起作用,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我有一个包含多个问卷的数据库,每个问卷都有相关的问题,每个问题都有相关的答案 我正在尝试创建一个存储过程,该过程将删除所有问题和相关答案,并且只使用问卷的ID。 我的存储过程如下所示: ALTER PROCEDURE [dbo].[DeleteQuestionnnaire] @EnqueteID bigint AS BEGIN SET NOCOUNT ON DECLARE @QID bigint DECLARE questionCursor CURSOR

我有一个包含多个问卷的数据库,每个问卷都有相关的问题,每个问题都有相关的答案

我正在尝试创建一个存储过程,该过程将删除所有问题和相关答案,并且只使用问卷的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
相关的问题被删除了,但是相关的答案没有,所以我在循环中做了一些错误的事情,有人看到了吗


提前感谢

整体光标看起来不错。我将fetch语句(在循环中)移动到末尾之前的右下角。当前,您正在将第一个值提取到参数中,然后在进入循环后立即提取第二个值;有效地抛弃了第一个值,而从不使用它

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

整体光标看起来不错。我将fetch语句(在循环中)移动到末尾之前的右下角。当前,您正在将第一个值提取到参数中,然后在进入循环后立即提取第二个值;有效地抛弃了第一个值,而从不使用它

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

您的游标有点奇怪,因为
FETCH NEXT
通常是循环中的最后一条语句(参见中的示例),因此实际上,您获取的第一个值立即被第二个值替换。将一些
PRINT
语句添加到光标中以检查
@QID
的当前值将显示这一点

但真正的答案是根本不用光标,这里没有必要:

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

您的游标有点奇怪,因为
FETCH NEXT
通常是循环中的最后一条语句(参见中的示例),因此实际上,您获取的第一个值立即被第二个值替换。将一些
PRINT
语句添加到光标中以检查
@QID
的当前值将显示这一点

但真正的答案是根本不用光标,这里没有必要:

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

您先获取第一个,然后获取第二个,这样第一个就不会被删除

FETCH questionCursor INTO @QID  

WHILE(@@fetch_status=0)
BEGIN

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

END


您先获取第一个,然后获取第二个,这样第一个就不会被删除

FETCH questionCursor INTO @QID  

WHILE(@@fetch_status=0)
BEGIN

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

END


切换fetch和delete可能会有所帮助?你知道这不是正确的方法,对吧?您只需编写一条delete语句来删除答案,并将其连接到要删除的结果上,而不是使用光标
DELETE FROM回答连接问题q on a.QuestionID=q.ID其中q.EnqueteID=@EnqueteID
切换fetch和DELETE可能会有帮助?你知道这不是正确的方法,对吧?您只需编写一条delete语句来删除答案,并将其连接到要删除的结果上,而不是使用光标
DELETE FROM回答a上的连接问题q.QuestionID=q.ID其中q.EnqueteID=@EnqueteID
谢谢,这解决了循环问题。我确实使用了Pondfiles解决方案,因为正如他所说,这里不需要循环。谢谢,这解决了循环问题。我确实使用了Pondfile解决方案,因为正如他所说,这里不需要循环。谢谢Pondfile!这显然是最好的解决方案。谢谢Pondfile!这显然是最好的解决办法。