Calcul de SQL Server ROW_NUMBER () OVER () pour une table dérivée

Dans d'autres bases de données (par exemple, DB2 ou Oracle avec ROWNUM), je peux omettre le ORDER BY clause dans une fonction de classement est OVER() clause. Par exemple:

ROW_NUMBER() OVER()

Ceci est particulièrement utile lorsqu'il est utilisé avec commandés tables dérivées, telles que:

SELECT t.*, ROW_NUMBER() OVER()
FROM (
    SELECT ...
    ORDER BY
) t

Comment cela peut-il être imité dans SQL Server? J'ai trouvé des gens à l'aide de cette astucemais c'est faux, car il va se comporter de manière non-déterministe avec la commande de la table dérivée:

-- This order here ---------------------vvvvvvvv
SELECT t.*, ROW_NUMBER() OVER(ORDER BY (SELECT 1))
FROM (
    SELECT TOP 100 PERCENT ...
    -- vvvvv ----redefines this order here
    ORDER BY
) t

Un exemple concret (comme on peut le voir sur SQLFiddle):

SELECT v, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM (
  SELECT TOP 100 PERCENT 1 UNION ALL
  SELECT TOP 100 PERCENT 2 UNION ALL
  SELECT TOP 100 PERCENT 3 UNION ALL
  SELECT TOP 100 PERCENT 4
  -- This descending order is not maintained in the outer query
  ORDER BY 1 DESC
) t(v)

Aussi, je ne peux pas réutiliser tout l'expression de la dérivée de la table de reproduire le ORDER BY clause dans mon cas, comme la table dérivée peut ne pas être disponible comme elle peut être fournie par certains logique externe.

Alors, comment puis-je le faire? Puis-je le faire?

source d'informationauteur Lukas Eder