重新索引表;用来更新

时间:2010-03-22 22:09:28

标签: sql-server sql-server-2008

查询说明了一切,我没有使用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 w2.ParentID=@ParentID
 )
 WHERE Webtree.BranchID=w2.BranchID

1 个答案:

答案 0 :(得分: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个月后返回并更改此代码,则自己)...