Usando funciones Recursivas CTE’s. para crear secuencias

Posted by admin | Posted in AntiCursores, Relacional | Posted on 24-12-2009

0

Para distintas funcionalidades (os pondré algún ejemplo en los siguientes dias que vienen del gran Itzik )  es muy interesante tener una tabla con números del 1 al n, se pueden usar para convertir parámetros separados por comas en valores, se pueden usar para simular joins y duplicar filas, bueno, tienen un gran número de utilidades y funcionalidades.

Lo que os voy a contar hoy es como hacerlo sin recurrir a los cursores

Lo típico es utilizar una sentencia del tipo while para rellenar esos valores. Veamos un ejemplo

declare @t table (id int)

declare @num int

 set @num=0

 while @num<=10000

  begin

       insert into @t values (@num)

      set @num=@num+1

end

select * from @t

Esto no deja de ser un cursor, y ya sabeis que soy de la opinión de que el único cursor bueno es el cursor muerto y me considero miembro activo de “la brigada anticursores”.   Antes de SQL 2005, no podía sin embargo matar este cursor excepto usando triquiñuelas que nada me gustaban y que probablemente eran peor que el propio cursor :) , sin embargo con las CTE’s son sencillos de eliminar. Las CTE’s permiten recursividad, es decir yo puedo basar el resultado de un query en el resultado del anterior, esta va a ser la idea, primero declararemos la cte con la cláusula with, luego pondremos la cláusula de inicio que será un siemple SELECT 0 as id, después usaremos la CTE para incrementar de 1 en uno y luego  pondremos la cláusula de salida de la recursividad ( en el where ), el resultado es el siguiente :

With MiPrimeraCTE (id )
as
(
select 0 as id
union all 
select id+1 from MiPrimeraCTE where Id < 10000 )
select * from MiPrimeraCTE option(maxrecursion 0)

 

La única curiosidad que nos queda por resolver es la última cláusula (option maxrecursion) eso es simplemente porque el limite de llamadas recursivas en SQL Server 2005 y 2008 está en 100, (en SQL 2000 estaba en 32), y hay que prevenirse de esa limitación para no obtener un error. Para ello usamos ese Query hint. En el proximo artículo lo usaremos con fechas que también funciona y bastante bien, y veremos un par de lugares en el que nos puede resultar útil.

Feliz Navidad

Posted by admin | Posted in Noticias | Posted on 24-12-2009

0

Os voy a felicitar la navidad, con lo que hacemos los techies, con un artículo, espero que resulte interesante para vosotros