Cálculo del ROW_NUMBER () OVER () de SQL Server para una tabla derivada

En algunas otras bases de datos (por ejemplo, DB2 u Oracle conROWNUM), Puedo omitir elORDER BY cláusula en una función de clasificaciónOVER() cláusula. Por ejemplo:

ROW_NUMBER() OVER()

Esto es particularmente útil cuando se usa con tablas derivadas ordenadas, tales como:

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

¿Cómo se puede emular esto en SQL Server? He encontrado gente usandoesta truco, pero eso es incorrecto, ya que se comportará de manera no determinista con respecto al orden de la tabla derivada:

-- 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 ejemplo concreto (como se puede ver enSQLFiddle):

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)

Además, no puedo reutilizar ninguna expresión de la tabla derivada para reproducir elORDER BY cláusula en mi caso, ya que la tabla derivada podría no estar disponible, ya que podría estar provista por alguna lógica externa.

Entonces, ¿cómo puedo hacerlo? ¿Puedo hacerlo en absoluto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta