none
Armar sql dependiendo de las condiciones Base de datos RRS feed

  • Pregunta

  • Buenos días, escribo en esta oportunidad porque me gustaría saber si a un procedimiento almacenado se le puede asignar condiciones y dependiendo de la condición, ir armando la consulta, estoy trabajando con mysql pero elegi este el tema de sql server porque como es base de datos puede tener relación, este es el ejemplo que estoy utilizando pero no me funciona:

    DELIMITER $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_reporte_solicitudes`(IN pstatusreq INT, IN ptipo INT)
    BEGIN
    	DECLARE consulta  varchar(255);
        DECLARE condicion varchar(255);
        
    	IF ptipo = 1 THEN
        	SET condicion= "(idstatusreq=1 OR idstatusreq=2)";
        ELSE
        	SET condicion = "idstatusreq=pstatusreq";
        END IF;
        SELECT * FROM requerimiento WHERE + condicion;
    END$$
    DELIMITER ;

    Que me recomiendan? Se puede declarar variables y luego ir armando la condición dependiendo de las condiciones?

    martes, 30 de octubre de 2018 15:11

Respuestas

  • Muchas gracias a todos por responderme, estuve revisando para que funcionará, hasta que funciono, dejo el detalle de como lo hice:
    DELIMITER $$
    CREATE PROCEDURE `sp_reporte`(IN `pstatusreq` INT, IN `ptipo` INT)
    BEGIN
    	DECLARE condicion VARCHAR(100);
    	SET condicion = "";
        
    	IF ptipo = 1 THEN
        	SET condicion= " idstatusreq=1 OR idstatusreq=2";
        ELSE
        	SET condicion = CONCAT(" idstatusreq=",pstatusreq);
        END IF;
    SET @consulta = CONCAT("SELECT * FROM requerimiento WHERE ", condicion);
    PREPARE stmt FROM @consulta;
    EXECUTE stmt;
    END$$
    DELIMITER ;
    Saludos. Muchas gracias!
    martes, 30 de octubre de 2018 19:12

Todas las respuestas

  • Hola TeresaAgui:

    Se puede hacer tanto en SQL Server como MySQL.

    Depende de la complejidad de las consultas interiores el plan de ejecucion a lo mejor no es perfecto. Mi consejo es que lo pruebes. Pero ademas hazlo por separado tambien y compara las diferencias en ejecucion.

    martes, 30 de octubre de 2018 15:17
  • Hola, te paso un ejemplo de como se declararia un Store Procedure en SQL Server, esto te puede ayudar ( las sentencias entre Mysql y SQL son totalmente diferentes 

    Ejemplo 

       
    			
    -- ================================================
    -- Template generated from Template Explorer using:
    -- Create Procedure (New Menu).SQL
    --
    -- Use the Specify Values for Template Parameters 
    -- command (Ctrl-Shift-M) to fill in the parameter 
    -- values below.
    --
    -- This block of comments will not be included in
    -- the definition of the procedure.
    -- ================================================
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- AUTHOR:Elihu Neftali Sandoval Rodriguez
    -- CREATE DATE: ---/--/--
    -- UPDATED BY : --
    -- UPDATE DATE: --
    -- VERSION : 0.1
    -- DESCRIPTION:	
    -- =============================================
    CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> 
    
    
    	<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
    	<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
    AS
    BEGIN
    
    	SET NOCOUNT ON;
    
    	BEGIN TRANSACTION
    			BEGIN TRY
    				COMMIT TRANSACTION
    					SELECT 'Soy el amo del planeta'
    	
    			END TRY
    
    	BEGIN CATCH
    		ROLLBACK TRANSACTION
    		DECLARE @ERRORMSJ AS VARCHAR(MAX) = ERROR_MESSAGE()
    		DECLARE @_MENSAJELOG AS VARCHAR(MAX) = NULL;
    		PRINT 'ERRORMSJ::' + @ERRORMSJ;
    	END CATCH
    END
    
    

    Saludos !!

    martes, 30 de octubre de 2018 15:18
  • Hola TeresaAgui:

    En transact no se pueden armar las consultas con literales, directamente, para eso habría que hacer una consulta dinámica.

    En el caso que expones ,la manera más simple es esta:

    create procedure sp_Reporte_solicitudes (
    	@pstatusreq int, 
    	@ptipo int
    	)
    	as
    declare @consulta varchar(255);
    declare @condicion varchar(255);
    
    if (@ptipo = 1)
    begin
    	select * from requerimiento
    	 where idstatusreq in (1,2);
    end
    else
    begin
    	select * from requerimiento 
    	where idstatusreq = @pstatusreq
    end
    return
    
    

    Si quieres hacer un query dinámico:

    http://www.devjoker.com/contenidos/articulos/308/SQL-dinamico-en-Transact-SQL.aspx

    Espero te ayude

    martes, 30 de octubre de 2018 17:15
  • Muchas gracias a todos por responderme, estuve revisando para que funcionará, hasta que funciono, dejo el detalle de como lo hice:
    DELIMITER $$
    CREATE PROCEDURE `sp_reporte`(IN `pstatusreq` INT, IN `ptipo` INT)
    BEGIN
    	DECLARE condicion VARCHAR(100);
    	SET condicion = "";
        
    	IF ptipo = 1 THEN
        	SET condicion= " idstatusreq=1 OR idstatusreq=2";
        ELSE
        	SET condicion = CONCAT(" idstatusreq=",pstatusreq);
        END IF;
    SET @consulta = CONCAT("SELECT * FROM requerimiento WHERE ", condicion);
    PREPARE stmt FROM @consulta;
    EXECUTE stmt;
    END$$
    DELIMITER ;
    Saludos. Muchas gracias!
    martes, 30 de octubre de 2018 19:12