none
Consulta RRS feed

  • Pregunta

  • Hola amigos del foro,

    Tengo un procedimiento almacenado  el cual contiene una consulta select. En el procedimiento almacenado tengo varias variables. Para evitar de que el motor de base de datos me reclame que no he asignado un valor a esas variables las inicializo con Null. 

    ALTER PROCEDURE [dbo].[SpComprasListar]
    @ID_Compra AS INT=Null,
    @ID_Proveedor AS INT=Null,
    @ID_Estado AS INT=Null,
    @ID_Producto AS INT=Null,
    @Cantidad AS INT=Null,
    @Fecha_Compra AS DATETIME=Null,
    @Codigo AS NVARCHAR(100)=Null,
    @N_Tracking AS NVARCHAR(100)=Null,
    @Fecha_Envio AS DATETIME=Null
    
    AS
    BEGIN
    SELECT     Compras.ID_Compra, Compras.ID_Proveedor, Compras.ID_Estado, Compras.Cantidad, Compras.Fecha_Compra, Compras.Codigo, Compras.N_Tracking, 
                          Compras.Fecha_Envio, Productos.Nombre AS Producto, Compras.ID_Producto, Proveedores.Nombre AS Proveedor, Estado_de_Compra.Descripcion AS Estado, 
                          CASE WHEN Estado_de_Compra.Descripcion = 'PREVISTO' THEN DATEDIFF(D, Compras.Fecha_Compra, GETDATE()) END AS TT
    FROM         Compras INNER JOIN
                          Productos ON Compras.ID_Producto = Productos.ID_Producto INNER JOIN
                          Proveedores ON Compras.ID_Proveedor = Proveedores.ID_Proveedor INNER JOIN
                          Estado_de_Compra ON Compras.ID_Estado = Estado_de_Compra.ID_Estado
                          
    WHERE     Compras.ID_Compra IS NULL
    
     END
    

    Pido de su ayuda para que me digan como es que debo hacer para mostrar todos los registros si es que la variable esta Null.

    Por ejemplo, si desde la aplicación no envío el idcompra que la consulta me devuelva todos los registros disponibles, de lo contrario me muestre el resultado del numero enviado desde la aplicación.

    De antemano muchas gracias.


    Saludos desde Chile.

    domingo, 19 de junio de 2016 0:50

Respuestas

  • Aprendiz_Chile,

    Intenta con lo siguiente:

    ALTER PROCEDURE [dbo].[SpComprasListar]
    	@ID_Compra AS int = NULL,
    	@ID_Proveedor AS int = NULL,
    	@ID_Estado AS int = NULL,
    	@ID_Producto AS int = NULL,
    	@Cantidad AS int = NULL,
    	@Fecha_Compra AS datetime = NULL,
    	@Codigo AS nvarchar(100) = NULL,
    	@N_Tracking AS nvarchar(100) = NULL,
    	@Fecha_Envio AS datetime = NULL
    AS
    BEGIN
    	SELECT     
    		Compras.ID_Compra, 
    		Compras.ID_Proveedor, 
    		Compras.ID_Estado, 
    		Compras.Cantidad, 
    		Compras.Fecha_Compra, 
    		Compras.Codigo, 
    		Compras.N_Tracking, 
    		Compras.Fecha_Envio, 
    		Productos.Nombre AS Producto, 
    		Compras.ID_Producto, 
    		Proveedores.Nombre AS Proveedor, 
    		Estado_de_Compra.Descripcion AS Estado, 
    		CASE 
    			WHEN Estado_de_Compra.Descripcion = 'PREVISTO' THEN 
    				DATEDIFF(D, Compras.Fecha_Compra, GETDATE()) 
    		END AS TT
    	FROM         
    		Compras 
    		INNER JOIN Productos ON (Compras.ID_Producto = Productos.ID_Producto) 
    		INNER JOIN Proveedores ON Compras.ID_Proveedor = Proveedores.ID_Proveedor) 
    		INNER JOIN Estado_de_Compra ON (Compras.ID_Estado = Estado_de_Compra.ID_Estado)
    	WHERE     		
    		(Compras.ID_Compra = @ID_Compra OR @ID_Compra IS NULL)
    		AND (Compras.ID_Proveedor = @ID_Proveedor OR @ID_Proveedor IS NULL)
    		AND /*Demás variables*/
    END

    • Propuesto como respuesta Asier Villanueva domingo, 19 de junio de 2016 5:44
    • Marcado como respuesta Aprendiz_Chile domingo, 19 de junio de 2016 16:08
    domingo, 19 de junio de 2016 1:28

Todas las respuestas

  • Aprendiz_Chile,

    Intenta con lo siguiente:

    ALTER PROCEDURE [dbo].[SpComprasListar]
    	@ID_Compra AS int = NULL,
    	@ID_Proveedor AS int = NULL,
    	@ID_Estado AS int = NULL,
    	@ID_Producto AS int = NULL,
    	@Cantidad AS int = NULL,
    	@Fecha_Compra AS datetime = NULL,
    	@Codigo AS nvarchar(100) = NULL,
    	@N_Tracking AS nvarchar(100) = NULL,
    	@Fecha_Envio AS datetime = NULL
    AS
    BEGIN
    	SELECT     
    		Compras.ID_Compra, 
    		Compras.ID_Proveedor, 
    		Compras.ID_Estado, 
    		Compras.Cantidad, 
    		Compras.Fecha_Compra, 
    		Compras.Codigo, 
    		Compras.N_Tracking, 
    		Compras.Fecha_Envio, 
    		Productos.Nombre AS Producto, 
    		Compras.ID_Producto, 
    		Proveedores.Nombre AS Proveedor, 
    		Estado_de_Compra.Descripcion AS Estado, 
    		CASE 
    			WHEN Estado_de_Compra.Descripcion = 'PREVISTO' THEN 
    				DATEDIFF(D, Compras.Fecha_Compra, GETDATE()) 
    		END AS TT
    	FROM         
    		Compras 
    		INNER JOIN Productos ON (Compras.ID_Producto = Productos.ID_Producto) 
    		INNER JOIN Proveedores ON Compras.ID_Proveedor = Proveedores.ID_Proveedor) 
    		INNER JOIN Estado_de_Compra ON (Compras.ID_Estado = Estado_de_Compra.ID_Estado)
    	WHERE     		
    		(Compras.ID_Compra = @ID_Compra OR @ID_Compra IS NULL)
    		AND (Compras.ID_Proveedor = @ID_Proveedor OR @ID_Proveedor IS NULL)
    		AND /*Demás variables*/
    END

    • Propuesto como respuesta Asier Villanueva domingo, 19 de junio de 2016 5:44
    • Marcado como respuesta Aprendiz_Chile domingo, 19 de junio de 2016 16:08
    domingo, 19 de junio de 2016 1:28
  • Muchas gracias.

    Era lo que estaba buscando.


    Saludos desde Chile.

    domingo, 19 de junio de 2016 16:08
  • Tambien puedes hacer uso de la opcion OPTION (RECOMPILE) a nivel de sentencia para que el optimizador pueda usar los valores de los parametros en uso a la hora de ejecutar la sentencia y escoger el plan que mejor se adapte.

    Esta opcion permitiria que si por ejemplo el parametro @ID_Compra es la marca NULL entonces esa expresion seria eliminada del predicado.

    Ten en cuenta que esta opcion a pesar de ser util para casos donde los valores de los parametros cambian constantemente y con estos la cardinalidad del resultado, tambien afecta en el sentido que la sentencia debera ser compilada en cada ejecucion. Deberas escoger entre tener un plan que se adapte mejor a la cardinalidad del predicado y compilar la sentencia cada vez que se ejecute o que el plan no sea el mejor pero no incurrir en compilacion por ejecucion.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 20 de junio de 2016 13:00