我正在尝试发送一个数字和标识符,并在while循环中更新行。
例如@Number = 1
和
MAX(Number)
FROM QuestionnaireQuestions
WHERE Questionnaire_ID = @Questionnaire_ID = 4
当我期望3,2,1时,结果是值1,1,1。
CREATE PROCEDURE [dbo].[DeleteQuestion]
(@QuestionnaireQuestions_ID BIGINT,
@Questionnaire_ID BIGINT,
@Number SMALLINT)
AS
DECLARE @i AS SMALLINT
SELECT @i = MAX(Number)
FROM QuestionnaireQuestions
WHERE Questionnaire_ID = @Questionnaire_ID
WHILE ( @i > @Number )
BEGIN
UPDATE QuestionnaireQuestions
SET Number = ( @i - 1 )
WHERE Number = @i
AND Questionnaire_ID = @Questionnaire_ID
SET @i = @i - 1
END
DELETE QuestionnaireQuestions
WHERE QuestionnaireQuestions_ID = @QuestionnaireQuestions_ID
答案 0 :(得分:3)
我会修改它只需要一个id。这样你就永远无法传递不属于一起的价值观。
CREATE PROCEDURE [dbo].[DeleteQuestion] (@QuestionnaireQuestions_ID BIGINT)
AS
DECLARE @Questionnaire_ID BIGINT,
@Number SMALLINT
SELECT @Questionnaire_ID = Questionnaire_ID,
@Number = Number
FROM QuestionnaireQuestions
WHERE QuestionnaireQuestions_ID = @QuestionnaireQuestions_ID
DELETE QuestionnaireQuestions
WHERE QuestionnaireQuestions_ID = @QuestionnaireQuestions_ID
UPDATE QuestionnaireQuestions
SET Number = Number - 1
WHERE Questionnaire_ID = @Questionnaire_ID
AND Number > @Number
END
答案 1 :(得分:1)
如果问题编号不仅仅是问卷中的排序,为什么不简单地将最初分配给该问题的编号留下,然后在显示或以其他方式处理时对其重新编号。
这样,更改数据只会对受影响的行产生本地影响。
答案 2 :(得分:0)
以下是我认为正在发生的事情,假设ID不是唯一ID ...假设您有值为4,3,2,1的行。
当你第一次运行select时,你会得到4行。当你更新它时,表将有行:3,3,2,1。
当你再次选择时,你得到3行,当你更新时得到:2,3,2,1。重复此操作(R表示选择结果,U表示更新结果):
R:3
U:2,2,2,1
R:2
U:1,2,2,1
R:2
U:1,1,2,1
R:1
U:1,1,1,1
解决此问题的一种方法是将搜索条件分开,以便不依赖于更新的列。