Si el rendimiento es su preocupación, puesto esta UDF listo:
create function [dbo].[Numbers](@count bigint)
RETURNS TABLE RETURN
with byte (n) as (select 1 from (VALUES
(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
,(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
) x(n) )
, byte2 (n) as (select 1 from byte a, byte b)
, byte4 (n) as (select 1 from byte2 a, byte2 b)
, byte8 (n) as (select 1 from byte4 a, byte4 b)
select top(@count) n = ROW_NUMBER() over(order by n) from byte8
Al parecer, la recursividad de sólo CTE obras generadas por secuencia de números, pero muy lento Aquí intercambiamos algún volumen de código por un gran aumento en el rendimiento. Este me da más de 30 millones de números en 8 segundos en mi horrible PC sobrecargada. Puede ir tan lejos como desee y puede pagar hasta el límite de bigint máximo.
No tocará el disco IO a menos que el optimizador lo elimine de la memoria (casi nunca para un escenario razonable). También evitará esperas y bloqueos a diferencia de las soluciones basadas en tablas físicas.
uso como esto:
select 2 + n*5 from Numbers(100)
Usted debe ser capaz de crear una vista como esta.
Para aquellos que no requieren un número real, solo filas, eliminar el número de fila cosas lo acelera dos veces.
Inspirado por http://weblogs.sqlteam.com/jamesn/archive/2008/05/29/60612.aspx (Itzik Ben Gan mencionado por S. Neumann). Esta versión viene con un plan de ejecución más simple y hace posibles los grandes, eso es sobre las ventajas.
¿Hay alguna razón para hacer esto en SQL y no en el nivel de aplicación? – Borealid
@Borealid - A menudo es útil tener una tabla de Números Auxiliares en SQL. –
@Borealid: Si pudiera generar una tabla de este tipo, creo que podría usarla para crear consultas más complejas; Si lo genero en la aplicación, creo que me quedaré atrapado con sentencias SQL super largas con la secuencia integrada en ellas. –