El truco en sí no es demasiado complejo (cuando te lo han explicado), el truco consiste en hacer join con una tabla que simplemtne tenemos de comodín en nuestras bases de datos (yo ya lo pongo en todas), la tabla se llama nums y contiene los valores del 1 al N (en el ejemplo al 10000), a partir de ahí, la imaginación hace el resto.
Aquí teneis el código, está escrito para SQL 2005.
use pruebas
go
drop table demo
drop table nums
go
create table demo (id smallint identity(1,1) primary key,
foo char(20) not null default ‘hola’)
go
declare @i int
set @i=10
while @i>0
begin
insert into demo default values
set @i=@i–1
end
go
insert into demo (foo) values(‘Dos’)
insert into demo (foo) values(‘Tres’)
go
create table nums (num smallint)
go
with Recu(id) as
(
select 1 as id
union all
select id +1 from Recu where id<10000
)
insert into nums(num)
select id from Recu option(maxrecursion 0)
go
select d.*
From demo d
inner join nums n
on case d.foo when ‘Dos’ then 2 when ‘Tres’ then 3 else 1 end>=n.num
Jesús López, el SQL Ranger, mandó también este código, también es divertido 🙂
CREATE FUNCTION GenerateNumbers(
@n int
) RETURNS TABLE
AS RETURN (
WITH CTE(n)
AS
(
SELECT 1 AS n
UNION ALL
SELECT n + 1 AS n
FROM CTE
WHERE n < @n
)
SELECT TOP(@n) n
FROM CTE
)
GO
CREATE TABLE T (
Field varchar(50),
Records int
)
GO
INSERT INTO T VALUES(‘Record 1’, 1)
INSERT INTO T VALUES(‘Record 2’, 0)
INSERT INTO T VALUES(‘Record 3’, 2)
INSERT INTO T VALUES(‘Record 4’, 3)
GO
SELECT T.*
FROM T CROSS APPLY GenerateNumbers(Records)
OPTION (MAXRECURSION 0)