none
tengo el siguiente problema, tengo una clasificación según un valor numeric el cual mando al procedimiento, pero cuando deseo seleccionar lo que me retorna es "Error de conversión al convertir el valor varchar 'Normal' al tipo de datos int." RRS feed

  • Pregunta

  • create procedure SP_clasificacion_imc 
    @imc decimal (5,2),
    @estado varchar(30) output,
    @tipo varchar(30) output

    as
    begin

    if @imc < 16.00
    begin
    set @tipo='Bajo peso'
    set @estado = 'Delgadez severa'
    end
    if @imc >= 16.00 and @imc <= 16.99
    begin
    set @tipo='Bajo peso'
    set @estado = 'Delgadez moderada' 
    end
    if @imc between 17.00 and 18.49
    begin 
    set @tipo='Bajo peso'
    set @estado = 'Delgadez leve'
    end 
    if @imc between 18.5 and 24.99
    begin 
    set @estado = 'Normal'
    set @tipo = 'Normal'
    end 
    if @imc between 25.00 and 29.99
    begin
    set @tipo='Sobrepeso '
    set @estado = 'Preobeso'
    end
    if @imc between 30.00 and 34.99
    begin
    set @tipo=' Obesidad '
    set @estado = 'Obesidad leve'
    end
    if @imc between 35.00 and 39.99
    begin
    set @tipo=' Obesidad '
    set @estado = 'Obesidad media'
    end

    if @imc >= 40.00 
    begin
    set @tipo=' Obesidad '
    set @estado = 'Obesidad Mórida'
    end
    return @estado 
    return @tipo

    end


    declare @estado varchar(30)
    declare @tipo varchar(30)
    exec [dbo].[SP_clasificacion_imc] 19.69, @estado output, @tipo output
    select @estado, @tipo

    miércoles, 1 de mayo de 2019 6:35

Respuestas

  • Hola LHurtadoC:

    Para esas cosas, sql server dispone de funciones que quizá se adapten mejor.

    create function fn_Classificacion_imc 
    (
        @imc decimal (5,2)
    ) returns @imcTable table (tipo nvarchar(100), estado nvarchar(100))
    as
    begin
    insert into @imcTable (tipo, estado)
    SELECT top (1) 
    	  tbl.tipo
    	, tbl.estado
    FROM  
    	(VALUES
        (16.00,'Bajo Peso','Delgadez severa'),
        (16.99,'Bajo peso','Delgadez moderada' ),
        (18.49,'Bajo peso','Delgadez leve' ),
        (24.99,'Normal','Normal' ),
        (29.99,'Sobrepeso','Preobeso' ),
        (34.99,'Obesidad','Obesidad leve' ),
        (39.99,'Obesidad','Obesidad media' ),
        (1000,'Obesidad','Obesidad morbida' )) AS tbl(imc, tipo, estado)
    WHERE  tbl.imc >= @imc
    ORDER BY tbl.imc
    
    RETURN 
    
    END
    
    

    Y podemos invocarla.

    SELECT * FROM fn_Classificacion_imc (19.69)

    de manera que nos permite mezclar su resultado con otra tabla 

    Por si te ayuda

    miércoles, 1 de mayo de 2019 7:14
  • Hola LHutadoC:

    Tienes que quitar los dos returns @estado y return @tipo por un sólo return sin nada más.

    Los parámetros out, ya los tienes asignados, no se devuelve.

    miércoles, 1 de mayo de 2019 7:05
  • Resumiendo, el procedure sería este.

    CREATE PROCEDURE SP_clasificacion_imc @imc    DECIMAL(5, 2)
    							 , @estado VARCHAR(30) OUTPUT
    							 , @tipo   VARCHAR(30) OUTPUT
    AS
        BEGIN
    	   IF @imc < 16.00
    		  BEGIN
    			 SET @tipo = 'Bajo peso';
    			 SET @estado = 'Delgadez severa';
    	   END;
    	   IF @imc >= 16.00
    		 AND @imc <= 16.99
    		  BEGIN
    			 SET @tipo = 'Bajo peso';
    			 SET @estado = 'Delgadez moderada';
    	   END;
    	   IF @imc BETWEEN 17.00 AND 18.49
    		  BEGIN
    			 SET @tipo = 'Bajo peso';
    			 SET @estado = 'Delgadez leve';
    	   END;
    	   IF @imc BETWEEN 18.5 AND 24.99
    		  BEGIN
    			 SET @estado = 'Normal';
    			 SET @tipo = 'Normal';
    	   END;
    	   IF @imc BETWEEN 25.00 AND 29.99
    		  BEGIN
    			 SET @tipo = 'Sobrepeso ';
    			 SET @estado = 'Preobeso';
    	   END;
    	   IF @imc BETWEEN 30.00 AND 34.99
    		  BEGIN
    			 SET @tipo = ' Obesidad ';
    			 SET @estado = 'Obesidad leve';
    	   END;
    	   IF @imc BETWEEN 35.00 AND 39.99
    		  BEGIN
    			 SET @tipo = ' Obesidad ';
    			 SET @estado = 'Obesidad media';
    	   END;
    	   IF @imc >= 40.00
    		  BEGIN
    			 SET @tipo = ' Obesidad ';
    			 SET @estado = 'Obesidad Mórida';
    	   END;
    	   RETURN;
        END;
    GO
    /* y aquí como lo consumes */
    declare @estado varchar(30)
    declare @tipo varchar(30)
    exec [dbo].[SP_clasificacion_imc] 19.69, @estado output, @tipo output
    select @estado, @tipo 

    Y la función un poco más abreviada, podría ser así:

    CREATE FUNCTION fn_Classificacion_imc
    (
        @imc decimal (5,2)
    )
    RETURNS TABLE
    AS 
    RETURN (
    SELECT top (1) 
    	  tbl.tipo
    	, tbl.estado
    FROM  
    	(VALUES
        (16.00,'Bajo Peso','Delgadez severa'),
        (16.99,'Bajo peso','Delgadez moderada' ),
        (18.49,'Bajo peso','Delgadez leve' ),
        (24.99,'Normal','Normal' ),
        (29.99,'Sobrepeso','Preobeso' ),
        (34.99,'Obesidad','Obesidad leve' ),
        (39.99,'Obesidad','Obesidad media' ),
        (1000,'Obesidad','Obesidad morbida' )) AS tbl(imc, tipo, estado)
    WHERE  tbl.imc >= @imc
    ORDER BY tbl.imc
    );
    GO
    /* Y su consumo este */
    SELECT * FROM fn_Classificacion_imc (19.69)

    Espero te ayude

    miércoles, 1 de mayo de 2019 7:35

Todas las respuestas

  • Hola LHutadoC:

    Tienes que quitar los dos returns @estado y return @tipo por un sólo return sin nada más.

    Los parámetros out, ya los tienes asignados, no se devuelve.

    miércoles, 1 de mayo de 2019 7:05
  • Hola LHurtadoC:

    Para esas cosas, sql server dispone de funciones que quizá se adapten mejor.

    create function fn_Classificacion_imc 
    (
        @imc decimal (5,2)
    ) returns @imcTable table (tipo nvarchar(100), estado nvarchar(100))
    as
    begin
    insert into @imcTable (tipo, estado)
    SELECT top (1) 
    	  tbl.tipo
    	, tbl.estado
    FROM  
    	(VALUES
        (16.00,'Bajo Peso','Delgadez severa'),
        (16.99,'Bajo peso','Delgadez moderada' ),
        (18.49,'Bajo peso','Delgadez leve' ),
        (24.99,'Normal','Normal' ),
        (29.99,'Sobrepeso','Preobeso' ),
        (34.99,'Obesidad','Obesidad leve' ),
        (39.99,'Obesidad','Obesidad media' ),
        (1000,'Obesidad','Obesidad morbida' )) AS tbl(imc, tipo, estado)
    WHERE  tbl.imc >= @imc
    ORDER BY tbl.imc
    
    RETURN 
    
    END
    
    

    Y podemos invocarla.

    SELECT * FROM fn_Classificacion_imc (19.69)

    de manera que nos permite mezclar su resultado con otra tabla 

    Por si te ayuda

    miércoles, 1 de mayo de 2019 7:14
  • Resumiendo, el procedure sería este.

    CREATE PROCEDURE SP_clasificacion_imc @imc    DECIMAL(5, 2)
    							 , @estado VARCHAR(30) OUTPUT
    							 , @tipo   VARCHAR(30) OUTPUT
    AS
        BEGIN
    	   IF @imc < 16.00
    		  BEGIN
    			 SET @tipo = 'Bajo peso';
    			 SET @estado = 'Delgadez severa';
    	   END;
    	   IF @imc >= 16.00
    		 AND @imc <= 16.99
    		  BEGIN
    			 SET @tipo = 'Bajo peso';
    			 SET @estado = 'Delgadez moderada';
    	   END;
    	   IF @imc BETWEEN 17.00 AND 18.49
    		  BEGIN
    			 SET @tipo = 'Bajo peso';
    			 SET @estado = 'Delgadez leve';
    	   END;
    	   IF @imc BETWEEN 18.5 AND 24.99
    		  BEGIN
    			 SET @estado = 'Normal';
    			 SET @tipo = 'Normal';
    	   END;
    	   IF @imc BETWEEN 25.00 AND 29.99
    		  BEGIN
    			 SET @tipo = 'Sobrepeso ';
    			 SET @estado = 'Preobeso';
    	   END;
    	   IF @imc BETWEEN 30.00 AND 34.99
    		  BEGIN
    			 SET @tipo = ' Obesidad ';
    			 SET @estado = 'Obesidad leve';
    	   END;
    	   IF @imc BETWEEN 35.00 AND 39.99
    		  BEGIN
    			 SET @tipo = ' Obesidad ';
    			 SET @estado = 'Obesidad media';
    	   END;
    	   IF @imc >= 40.00
    		  BEGIN
    			 SET @tipo = ' Obesidad ';
    			 SET @estado = 'Obesidad Mórida';
    	   END;
    	   RETURN;
        END;
    GO
    /* y aquí como lo consumes */
    declare @estado varchar(30)
    declare @tipo varchar(30)
    exec [dbo].[SP_clasificacion_imc] 19.69, @estado output, @tipo output
    select @estado, @tipo 

    Y la función un poco más abreviada, podría ser así:

    CREATE FUNCTION fn_Classificacion_imc
    (
        @imc decimal (5,2)
    )
    RETURNS TABLE
    AS 
    RETURN (
    SELECT top (1) 
    	  tbl.tipo
    	, tbl.estado
    FROM  
    	(VALUES
        (16.00,'Bajo Peso','Delgadez severa'),
        (16.99,'Bajo peso','Delgadez moderada' ),
        (18.49,'Bajo peso','Delgadez leve' ),
        (24.99,'Normal','Normal' ),
        (29.99,'Sobrepeso','Preobeso' ),
        (34.99,'Obesidad','Obesidad leve' ),
        (39.99,'Obesidad','Obesidad media' ),
        (1000,'Obesidad','Obesidad morbida' )) AS tbl(imc, tipo, estado)
    WHERE  tbl.imc >= @imc
    ORDER BY tbl.imc
    );
    GO
    /* Y su consumo este */
    SELECT * FROM fn_Classificacion_imc (19.69)

    Espero te ayude

    miércoles, 1 de mayo de 2019 7:35