2015-02-08 93 views
1

我試圖發送一個數字和標識符並更新while循環中的行。while循環中的SQL更新

例如,如果@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(這是一個真正的排序數字)。我很感激你花時間看我的問題。 – 2015-02-08 21:14:15

+0

正確。即使序列不連續,排序仍然存在。只要您阻止多個用戶同時刪除同一調查問卷中的行,您接受的答案就會生效。嘗試將數據模型與您的可視化佈局分開。 – Pekka 2015-02-08 21:27:12

0

以下是我認爲正在發生的事情,假設ID不是一個唯一的ID ...假設您的行的值爲4,3,2,1。

當你第一次運行你選擇,你會得到與行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,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 
+0

就是這樣JBrooks!非常感謝。 – 2015-02-08 21:09:53

+0

但是你的答案更清晰,但它仍然對我來說毫無意義爲什麼每個數字的組合都用我的while循環,除了1.抓我的頭... – 2015-02-08 21:18:08

+0

我只注意到你的編輯,事實上,參數標識符。很好。 – 2015-02-08 21:21:11