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 @num int
set @num=0
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 :
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.
