2012-04-08 15 views
38

El siguiente SQL es de Itzik Ben-Gan que se usa para generar una tabla de números. ¿Qué significa la parte order by (select null)? Gracias.¿Qué significa "ORDER BY (SELECT NULL)"?

DECLARE @number_of_numbers INT; 
SELECT @number_of_numbers = 100000; 

WITH a AS (SELECT 1 AS i 
       UNION ALL 
       SELECT 1 
      ), 
     b AS (SELECT 1 AS i 
       FROM  a AS x , 
         a AS y 
      ), 
     c AS (SELECT 1 AS i 
       FROM  b AS x , 
         b AS y 
      ), 
     d AS (SELECT 1 AS i 
       FROM  c AS x , 
         c AS y 
      ), 
     e AS (SELECT 1 AS i 
       FROM  d AS x , 
         d AS y 
      ), 
     f AS (SELECT 1 AS i 
       FROM  e AS x , 
         e AS y 
      ), 
     numbers 
      AS (SELECT TOP (@number_of_numbers) 
         ROW_NUMBER() OVER (ORDER BY (SELECT NULL 
                )) AS number 
       FROM  f 
      ) 
    SELECT * 
    FROM numbers; 

¡Gracias!

Respuesta

62

ROW_NUMBER requiere una cláusula ORDER BY sintácticamente. No puedes usarlo sin uno. SELECT NULL es un truco para silenciar el error sin imponer ningún orden en particular. En este caso, no es necesario que ejecute ningún pedido, por lo que la opción más rápida es usar SELECT NULL.

El optimizador cumple con este truco, por lo que no tiene costo de tiempo de ejecución (este reclamo se verifica fácilmente al mirar el plan de ejecución).

+12

También se puede usar como una declaración de intenciones cuando en realidad no se requiere. Por ejemplo, en el libro de kit de capacitación de Micrsoft "Query Microsoft SQL Server 2012", aconsejan que se agregue a una consulta válida como "... si está realmente después de tres filas arbitrarias, podría ser una buena idea agregar un ORDEN BY cláusula con la expresión (SELECCIONAR NULO) para que las personas sepan que su elección es intencional y no un descuido ". –