Ir al contenido principal

Optimizar consulta Transact SQL, Uso avanzado de Where, Minimizar codigo en tus sentencias SQL

El Objetivo del presente artículo es dar a conocer una forma de optimizar nuestras consultas de búsqueda al momento de crear procedimientos almacenados.
Para explicar vamos a crear un procedimiento almacenado de búsqueda con 9 parámetros en el cual vamos a poder realizar búsquedas por uno o por la combinación de los mismos; todo en una sola sentencia SELECT.

Estructura de la BD a utilizar:

Tablas: 
Alumnos:

Conceptos:

Deudas:

PROCEDIMIENTO ALMACENADO

    CREATE PROCEDURE [dbo].[proc_BuscarDeudas]
   
              @CodAlumno varchar(10),
              @NombAlumno varchar(150),
              @CodConcepto varchar(4),
              @AnioIni varchar(4),
              @AnioFin varchar(4),
              @CuotaIni varchar(3),
              @CuotaFin varchar(3),
              @FecVenIni datetime,
              @FecVenFin datetime
   
    AS
    BEGIN
   
      SELECT
           A.[CodAlumno],
           B.ApPaterno + ' ' + B.ApMaterno + ' ' + B.Nombres AS Alumno,
           [AnioDeu],
           [Cuota],
           A.[CodConcepto],
           C.NombConcepto,
           [DescDeuda],
           [Pension],
           [Monto],
           [Interes],
           [FecVencimiento]
      FROM [Deudas] A
      INNER JOIN Alumnos B ON A.CodAlumno=B.CodAlumno
      INNER JOIN MaesConceptos C ON A.CodConcepto=C.CodConcepto
      WHERE
        (@CodAlumno='' OR A.CodAlumno=@CodAlumno) AND
             (@NombAlumno='' OR B.ApPaterno + ' ' + B.ApMaterno + ' ' + B.Nombres LIKE '%' + @NombAlumno + '%') AND
        (@CodConcepto='' OR A.CodConcepto=@CodConcepto) AND
        (@AnioIni='' OR AnioDeu>=@AnioIni) AND
        (@AnioFin='' OR AnioDeu<=@AnioFin) AND
        (@CuotaIni='' OR Cuota>=@CuotaIni ) AND
        (@CuotaFin='' OR Cuota<=@CuotaFin) AND
        ((YEAR(@FecVenIni)='1900' AND YEAR(@FecVenFin)='1900') OR FecVencimiento BETWEEN @FecVenIni AND @FecVenFin)
   
    END


EXPLICACION:
Para conseguir nuestro objetivo haremos el uso apropiado de los aperadores lógicos OR Y AND, además necesitamos que cada uno de los parámetros de nuestro procedimiento almacenado tenga un valor de reseteo, para que así cuando no se necesite utilizar un determinado parámetro se pueda resetear enviándole dicho valor. En el caso del procedimiento almacenado que estamos utilizando en el ejemplo nuestro valores de reseteo serian '' para los parametros varchar y '1900' para los parámetro datetime.

Nuestra primera sentencia del WHERE es:
(@CodAlumno='' OR A.CodAlumno=@CodAlumno) (1)
En el caso de que enviemos como valor de reseteo '' para el parámetro @CodAlumno  la condición (1) se anularía.

Quedaría así:
(''='' OR A.CodAlumno='')

En valores lógicos seria:
(V OR A.CodAlumno='') Esta sentencia siempre será verdadera no importa el valor que devuelva A.CodAlumno='' por lo tanto toda la condición (1) es como si no existiera en el procedimiento almacenado.

En conclusión cuando no necesitemos de alguno de los parámetros del procedimiento almacenado basta con enviar el valor de reseteo para anular la condición.

Ejemplo 1:
Queremos consultar las deudas anteriores al año 2007.
La ejecución de nuestro procedimiento quedaría así:
EXEC proc_BuscarDeudas '','', '','','2007','','','01/01/1900','01/01/1900'




Ejemplo 2:
Queremos consultar las deudas de los alumnos que cuyo apellido  empiece con zapata.
La ejecución de nuestro procedimiento quedaría así:
EXEC proc_BuscarDeudas '','ZAPATA', '','','','','','01/01/1900','01/01/1900'


Ejemplo 3:
Queremos consultar las deudas del alumno cuyo código sea '0030006522' y cuota este entre 001 y 003.
La ejecución de nuestro procedimiento quedaría así:
EXEC proc_BuscarDeudas '0030006522','', '','','','001','003','01/01/1900','01/01/1900'


Comentarios

Entradas populares de este blog

Procedimiento almacenado para generar correlativo (Pedido, Orden de Compra, etc) evitando la concurrencia en una plataforma multiusuario.

En el presente artículo vamos a explicar una forma de crear un procedimiento almacenado para generar un numero correlativo (Factura, Pedido, Orden de Compra, N° de ticket) en un sistemas multiusuario, evitando la concurrencia. Crearemos un Procedimiento almacenado con los siguientes parámetros: @NumSalida: En este parámetro se almacena el numero correlativo generado para ser devuelto a la aplicación. @NombCampo: Aquí se envía el nombre de la variable del tipo de documento para el cuela se va a generar el correlativo. @Serie: Aquí se envía el número de serie o el año del correlativo del documento si es que lo tuviera, ejemplo en el caso de las factura hay serie 001, 002, 003, etc. @Tam: Este valor se utiliza para darle formato al correlativo a un tamaño determinado, ejemplo si se envía Tam=10 y el correlativo que sigue para N° de pedido es 10, el valor devuelto por el procedimiento seria 0000000010. @MostSelect: Este valor indica si el correlativo se devuelve con una sentencia ...

Instalación y Configuración de My Generation.

My Generation es una herramienta de uso libre que permite generar de manera sencilla clases a partir de una estructura de base de datos esto nos permite ahorrar tiempo valioso en el desarrollo de nuestros proyectos de programación en .NET (C#, VB). El proceso de instalación y configuración es sencillo y lo detallamos a continuación: INSTALACIÓN: Descarga del Instalador: Clic Aquí Una vez descargado el instalador se procede a la instalación, es muy intuitiva. Clic en I Agree (Aceptar) Desmarcar el Chek Detect MDAC 2.7++ Clic en Next (Siguiente) Dejamos el directorio de instalación por defecto y clic en Install CONFIGURACIÓN: Pantalla Principal Clic en Default Settings En la sección conection string seleccionamos el motor de base de datos que vamos a utilizar, en nuestro caso seleccionamos SQL Server. Aquí mismo se indican los parámetros de conexión de nuestro servidor SQL que previamente debemos instalar. En mi caso util...

Video Rockola YouTube 2020

Video Rockola YouTube 2020 es Software moderno y fácil de usar que nos permite la implementación de Vídeo Rockolas con acceso a los miles de vídeos de YouTube. Las características principales son: La principal característica y novedad es que se puede tener acceso a los miles de vídeos publicados en YouTube, el único requisito es tener acceso a Internet. Uso con Monitores Convencionales o TouchScreen. Además, se puede almacenar una galería de vídeos de manera local y acceder a ellos. Es de Fácil configuración, permite parametrizar las funcionalidades de acuerdo a las necesidades del cliente. Ver Funcionamiento en YouTube: Ver en Youtube Requisitos para la instalación: Windows 7 o superior. Net Framework 4.0 Contacto: ervize@hotmail.com WhatsApp: (51) 999302985