Siempre me han gustado los trucos, los tips, los retos, y este era uno de los que hasta que ví el truco del maestro Itzik Ben Gan no era tan sencillo de resolver.

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=@i1

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)

 

Miguel Egea