miércoles, 16 de febrero de 2011

Procedimiento almacenado con parámetros opcionales en búsquedas SQL SERVER

Existen situaciones en la que deseamos realizar búsquedas sobre un conjunto de datos con una gran variedad de filtros de tal manera que estos sean excluyentes o no.

Para dejar mas claro plantearemos un modelo de datos en el que tenemos almacenado en tres tablas la siguiente información: Departamento con un listado de departamentos, Municipio contiene un listado de municipios que están relacionados la tabla Departamentos y finalmente una tabla llamada Estudiante que contiene un listado de estudiantes los cuales residen en un municipio. El diagrama del modelo de datos seria mas o menos el siguiente.


Ahora si realizamos un procedimiento almacenado que al ejecutarlo nos retorne el resultado de todos los estudiante con su respectivo nombre, municipio y departamento donde reside. El resultado de datos seria mas o menos el siguiente .


La consulta SQL  requerida para generar la información anteriormente presentada seria la siguiente.


Ahora bien, imaginemos que queremos aplicar al mismo conjunto de datos varios filtros y que estos a su vez sean opcionales,  para ello crearemos un procedimiento almacenado y la estructura seria la siguiente.



Ahora si lo queremos podemos ejecutar nuestro procedimiento ya sea teniendo como filtro en las búsquedas el DepartamentoID, MunicipoID o DepartamentoID y MunipioID. La instrucción para ejecutar nuestro procedimiento ConsultarEstudiantes es el siguiente

2 comentarios:

Jose Miguel dijo...

Excelente tema, el único problema está cuando intentas comparar valores NULL, es decir, el campo en la Base de Datos está declarado como que acepta valores NULL, y el dato en la BD que se compara es NULL.

Es ahí cuando la comparación no te serviría, ya que no es lo mismo comparar 1=1 que NULL=NULL

salu2

Heliberto Arias dijo...

Tienes razón, en http://helibertoarias.com/sql/consultas-con-filtros-opcionales-en-sql-server/ puedes encontrar una variante a este post que me parece mas eficiente.

Saludos.