2015-02-08 5 views
1

Я пытаюсь отправить число и идентификаторы и обновить строки в цикле while.SQL Update in While Loop

Например, если @Number = 1

и

MAX(Number) 
FROM QuestionnaireQuestions 
WHERE Questionnaire_ID = @Questionnaire_ID = 4 

Результаты значения 1, 1, 1, когда я ожидал бы 3,2,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 

ответ

1

Если номер вопроса не больше, чем заказ в вопроснике, почему бы вам не просто оставить номер, первоначально назначенный на вопрос, а затем перенумеровать их, когда они будут показаны или иным образом обработаны.

Таким образом, изменение данных оказывает локальное воздействие на затронутую строку.

+0

Вы предлагаете использовать идентификатор строки, и если есть промежутки времени, то пусть у нас все еще есть заказ? Это определенно работает, но в моей сетке есть стрелки вверх и вниз вместе с возможностью удаления, поэтому я @Number (который действительно является номером сортировки). Я ценю, что вы нашли время, чтобы посмотреть на мою проблему. –

+0

Правильно. Порядок остается, даже если последовательность не смежна. Ответ, который вы приняли, будет работать до тех пор, пока вы не позволите нескольким пользователям одновременно удалять строки в одной и той же анкете. Попытайтесь сохранить модель данных отдельно от вашего визуального макета. – Pekka

0

Ниже то, что я думаю, что происходит, если предположить, идентификатор не является уникальным ID ... Скажем, у вас есть строки со значением 4,3,2,1.

При первом запуске вы выбираете, вы получаете строку с 4. Когда вы ее обновляете, таблица будет иметь строки: 3,3,2,1.

Когда вы выбираете снова, вы получаете строку с 3, а когда вы обновляете, вы получаете: 2,3,2,1. Повторяя этот (R означает результат выбора, U означает результат обновления):

Р: 3

U: 2,2,2,1

Р: 2

U: 1,2 , 2,1

Р: 2

U: 1,1,2,1

Р: 1

U: 1,1,1,1

Один из способов решения этой проблемы состоит в том, чтобы отделить ваши критерии поиска, чтобы они не зависели от обновленной колонки.

3

Я бы переделал его, чтобы получить только один идентификатор. Таким образом, вы никогда не сможете передать его значениям, которые не принадлежат друг другу.

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 
+0

Вот и все! JBrooks! Огромное спасибо. –

+0

Ваш ответ гораздо чище, но он все еще не имеет для меня никакого смысла, потому что каждый возможный комбо чисел работает с моим циклом while, за исключением 1. Царапина моей головы ... –

+0

Я просто заметил, что ваше редактирование, действительно, намного лучше иметь сингл идентификатор параметра. отлично. –