2010-03-22 57 views
1

查詢說它全部更新,沒有我無法找出正確的語法,而無需使用WHILE循環重新索引表;從

UPDATE Webtree SET Webtree.Sorting=w2.Sorting 
FROM 
(
    SELECT 
    BranchID, 
    CASE 
    WHEN @Index>=ROW_NUMBER() OVER(ORDER BY Sorting ASC) THEN ROW_NUMBER() OVER(ORDER BY Sorting ASC) 
    ELSE ROW_NUMBER() OVER(ORDER BY Sorting ASC)+1 
    END AS Sorting 
    FROM Webtree w2 
    WHERE [email protected] 
) 
WHERE Webtree.BranchID=w2.BranchID 

回答

0

不知道你是什麼版本的SQL Server - 如果你在SQL Server 2005或,你可以嘗試使用CTE(公共表表達式):

; WITH BaseData AS 
(
    SELECT 
     BranchID, 
     CASE 
     WHEN @Index >= ROW_NUMBER() OVER(ORDER BY Sorting ASC) THEN ROW_NUMBER() OVER(ORDER BY Sorting ASC) 
     ELSE ROW_NUMBER() OVER(ORDER BY Sorting ASC)+1 
     END AS Sorting 
    FROM Webtree 
    WHERE ParentID = @ParentID 
) 
UPDATE Webtree 
SET Webtree.Sorting = base.Sorting 
FROM BaseData base 
WHERE Webtree.BranchID = base.BranchID 

不知道在哪裏的@Index@ParentID值來自 - 他們將不得不提供給CTE,當然!

的CTE產生類似的「內聯臨時視圖」,這是適用於它之後的下一條語句。這樣一來,你常常可以「理清」兩個混雜的陳述,讓你的意圖,你的腳步更清晰(給別人讀代碼,或自己,如果你要回來,並在6個月的時間改變這種)...

+0

這是SQL Server 2008中 我想你的查詢,我得到「‘與’關鍵字附近有語法錯誤。如果這種說法是公用表表達式,一個XMLNAMESPACES子句或更改跟蹤上下文子句,那麼前一個語句必須以終止一個分號「。 – 2010-03-22 22:21:25

+0

它必須是批處理中的第一條語句 - 如果您之前有東西,請用分號(;)作爲前綴。 – 2010-03-22 22:22:13

+0

噢,該指數 – 2010-03-22 22:22:16