viernes, 22 de mayo de 2009

Recursividad con Sql Server

Una función muy interesante de Sql Server es la de poder seleccionar un conjunto de datos de forma recursiva de manera que podemos obtener una serie de datos en estructura de arbol.

Partimos de una tabla que tiene dos campos, llamados clave y padre, el campo clave se relaciona con el padre para formar la estructura en arbol.

El siguiente procedimiento almacenado muestra un ejemplo de como conseguir esto:

ALTER PROCEDURE [dbo].[Usuarios_seguridad_seleccionar]


AS


BEGIN    


    DECLARE @minClave int


    SELECT @minClave = MIN(Clave) FROM dbo.Usuarios_seguridad;


    


    WITH UsuariosAccesos AS


    (


        SELECT top 1 us1.Padre,us1.Clave,us1.Variable,us1.Modulo,us1.Contenido,us1.Acceso,us1.Imagen 


        FROM dbo.Usuarios_seguridad us1 


        WHERE us1.Clave = @minClave


        UNION ALL


        SELECT top 100 percent us2.Padre,us2.Clave,us2.Variable,us2.Modulo,us2.Contenido,us2.Acceso,us2.Imagen 


        FROM dbo.Usuarios_seguridad us2 


        INNER JOIN UsuariosAccesos AS us3 ON us3.Clave = us2.Padre  


        WHERE us2.Clave <> @minClave 


    )


 


    SELECT TOP 100 PERCENT ia.Padre,ia.Clave,ia.Variable,ia.Modulo,ia.Contenido,ia.Acceso,ia.Imagen 


    FROM UsuariosAccesos ia


    ORDER BY padre, clave


END


GO




 


El procedimiento almacenado calcula el valor mínimo del nodo con la clave mas baja, posteriormente va leyendo cada nodo relacionado de forma recursiva ya que en el inner join se relaciona con el conjunto de datos definido en la clausula WiTH, finalmente devuelve el conjunto de datos en un orden determinado, el resultado obtenido es el siguiente:


image



De esta forma la consulta devuelve los datos de forma similar a la estructura de estos, posteriormente se cargan el tree.



image









Si quereis mas información sobre la clausula WITH que permite realizar este tipo de consultas podeis encontrala en http://msdn.microsoft.com/en-us/library/ms175972.aspx

No hay comentarios:

Publicar un comentario