Generar muchas filas


A menudo necesitamos insertar una serie de registros, para laboratorios, o simplemente para llenar una tabla con cualquier valor.

Existen múltiples maneras de realizar esto. Vamos a ver una muy simple, y fácil de utilizar.

Utilizaremos una tabla de expresión común, row number y cross join. Y nos serviremos de sys.objects.

Una de las cosas que hay que tener en cuenta, es el número de rows que devuelve sys.objects, que pueden ser muchos o muchísimos. De cualquier manera, si no fuesen suficientes con 3 cruces entre sys.objects, sólo tendrías que añadir un 4 cruce.

Imagen de kalhh en Pixabay

-- Code 1.0

With cte as (
   Select 1 as n
From       sys.objects c
Cross join sys.objects d
Cross join sys.objects e
)
Select Row_number() over(order by n) as row
From cte;

La tabla de expresión común cte, contiene un select 1 para cada una de las filas que devuelva sys.objects, que serán «unas pocas», cruzada contra si misma, que serán «unas pocas», por «unas pocas», y cruzada de nuevo contra si misma, que serán «unas pocas» contra «unas pocas» contra «unas pocas». Lo que es igual a «un montonazo». Realmente el producto cartesiano de tantas filas, como tenga sys.objects, por cada cruce.

Luego la salida del cte, lo único que hace es numerar esas filas, por tanto tenemos una columna que va desde 1 hasta …….

Nota adicional: Si haces un select 1 from sys.Objects y te devuelve más de por ejemplo 1.000 filas, quizá la query puedes variarla tal que la Select de salida del cte, esté truncada por el operador Top: Select Top(n) Row_number…., donde n es el número de filas deseado, ya que tres cruces sobre un conjunto de más de 1.000 filas, te pueden dar una sorpresita.

Y con este simple código, ya tenemos muchas filas, para poder realizar nuestro objetivo.

Por ejemplo llenar una tabla de valores.

-- Code 1.1

Create table dbo.Valores 
(
id int,
valor varchar(100)
);

Con la tabla creada, adaptamos el código 1.0

-- Code 1.2

With cte as (
   Select 1 as n
From sys.objects c
Cross join sys.objects d
Cross join sys.objects e
)
Insert into dbo.Valores (id, valor)
Select 
   Row_number() over(order by n)
,  Cast((Row_number() over(order by n)) as varchar(100))
From cte;

Como sabemos generar un montón de filas, luego podemos adaptar la columna n que nos devuelve la tabla de expresión común, para rellenar nuestros datos.

Por ejemplo, adaptando el valor al tipo de dato, que espera la columna.

-- Code 1.3

Select Top(10) id, valor
from dbo.Valores
order by id desc

Y tenemos 34 millones de filas.

🙂


Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.