Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 11th, 2012  |  syntax: None  |  size: 2.29 KB  |  hits: 8  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. SQL Stored Procedure: Reordering rows after delete
  2. DECLARE @TaskID int
  3. DECLARE @SubTaskPosition int
  4.  
  5. DECLARE curSubTaskPositionUpdate cursor fast_forward
  6. FOR
  7.     SELECT TaskID, SubTaskPosition
  8.     FROM TaskDetails
  9.     WHERE SubTaskID = @SubTaskID
  10. OPEN curSubTaskPositionUpdate
  11. FETCH NEXT FROM curSubTaskPositionUpdate INTO @TaskID, @SubTaskPosition
  12. WHILE @@FETCH_STATUS = 0
  13.     BEGIN  
  14.         UPDATE TaskDetails
  15.         SET SubTaskPosition = SubTaskPosition - 1
  16.         WHERE TaskID = @TaskID
  17.         AND SubTaskPosition > @SubTaskPosition
  18.  
  19.         FETCH NEXT FROM curSubTaskPositionUpdate INTO @TaskID, @SubTaskPosition
  20.     END
  21. CLOSE curSubTaskPositionUpdate
  22. DEALLOCATE curSubTaskPositionUpdate
  23.        
  24. DECLARE @TaskID uniqueidentifier
  25. DECLARE @SubTaskPosition int
  26.  
  27. DECLARE curSubTaskPositionUpdate cursor fast_forward
  28. FOR  
  29.     SELECT TaskID, SubTaskPosition
  30.     FROM TaskDetails  
  31.     WHERE SubTaskID = @subTaskID
  32. OPEN curSubTaskPositionUpdate
  33. FETCH NEXT FROM curSubTaskPositionUpdate INTO @TaskID, @SubTaskPosition
  34. WHILE @@FETCH_STATUS = 0
  35.    BEGIN    
  36. -- Delete the subTask
  37. DELETE FROM TaskDetails
  38. WHERE TaskID = @TaskID
  39. AND SubTaskPosition = @SubTaskPosition
  40.  
  41. -- Update the other subTasks
  42.         UPDATE TaskDetails
  43.         SET SubTaskPosition = SubTaskPosition - 1
  44.         WHERE TaskID = @TaskID
  45.         AND SubTaskPosition > @SubTaskPosition
  46.  
  47.         FETCH NEXT FROM curSubTaskPositionUpdate INTO @TaskID, @SubTaskPosition
  48.     END
  49. CLOSE curSubTaskPositionUpdate
  50. DEALLOCATE curSubTaskPositionUpdate
  51.        
  52. UPDATE  TaskDetails
  53. SET     subTaskPosition = ROW_NUMBER() OVER(PARTITION BY TaskID  ORDER BY subTaskPosition)
  54. WHERE   TaskID IN(  SELECT  s.TaskID
  55.                     FROM    TaskDetails s
  56.                     WHERE   SubTaskID = @subTaskID)
  57.        
  58. ;WITH
  59.   cteRows As
  60. (
  61.     SELECT  *,
  62.     ROW_NUMBER() OVER(PARTITION BY TaskID  ORDER BY subTaskPosition) As NewPosition
  63.     FROM    TaskDetails
  64. )
  65. UPDATE  cteRows
  66. SET     subTaskPosition = NewPosition
  67. WHERE   TaskID IN(  SELECT  s.TaskID
  68.                     FROM    TaskDetails s
  69.                     WHERE   SubTaskID = @subTaskID)
  70.        
  71. declare @pos int
  72. select @pos = subTaskPosition from TaskDetails where SubTaskID = @subTaskID
  73. delete ...
  74. delete ...
  75. update TaskDetails set subTaskPosition = subTaskPosition + 1 where SubTaskID = @subTaskID and subTaskPosition > @pos