While循环中的SQL更新

时间:2015-02-08 20:32:56

标签: sql sql-server

我正在尝试发送一个数字和标识符,并在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 

3 个答案:

答案 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

解决此问题的一种方法是将搜索条件分开,以便不依赖于更新的列。