Sql server 循环在SQL存储过程中不起作用
我有一个包含多个问卷的数据库,每个问卷都有相关的问题,每个问题都有相关的答案 我正在尝试创建一个存储过程,该过程将删除所有问题和相关答案,并且只使用问卷的ID。 我的存储过程如下所示: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
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!这显然是最好的解决办法。