JustPaste.it

DROP TABLE IF EXISTS T;
GO
CREATE TABLE T (
  ID int identity(1,1) PRIMARY KEY,
  Parent int Foreign Key REFERENCES T(ID),
  SortingNumber int, b int, c int);
GO
INSERT INTO T(Parent, SortingNumber, b, c)
VALUES
  (1, 3, 1, -3),
  (1, 4, 2, 4),
  (1, 5, 1, NULL),
  (2, 8, 3, 1),
  (2, 10, 2, NULL),
  (2, 13, 1, 5);
SELECT * FROM T;

DECLARE @lastSO INTEGER = 0;


WITH toUpdate AS(
  SELECT
  T1.*,
  LAG(T1.SortingNumber + 1, 1, 1) OVER (ORDER BY T1.SortingNumber) AS [newSortNumber]
  FROM T AS T1
  INNER JOIN T AS T2
      ON T2.ID = T1.Parent
)
UPDATE toUpdate
SET
  @lastSO = CASE WHEN [newSortNumber] = 1 AND @lastSO = 0 THEN 1 ELSE @lastSO + 1 END,
toUpdate.SortingNumber = @lastSO

;

SELECT * FROM T;