none
Ayuda con un error en CURSOR RRS feed

  • Pregunta

  • Hola a todos por favor su ayuda, estoy creando un cursor que muestre los productos con su categorias pero al ejecutar me muestra este mensaje:

    Codigo    Categoria    Producto    Stock
    ========================================
    Mens. 245, Nivel 16, Estado 1, Línea 16
    Error de conversión al convertir el valor varchar 'Lacteos' al tipo de datos int.



    DECLARE @IdPro int,@Cat varchar(50),@Prod varchar(30),@Sto int
    DECLARE CURSOR_PRODUCTO CURSOR
    FOR SELECT IdProducto, c.Nombre as Categoria,
    p.Nombre as Producto, Stock  
    FROM PRODUCTO p 
    inner join categoria c on c.IdCategoria=p.IdCat
    OPEN CURSOR_PRODUCTO
    FETCH CURSOR_PRODUCTO into @IdPro, @Cat, @Prod, @Sto
    --Imprimir la cabezera de mi cursor
    print 'Codigo    Categoria    Producto    Stock'
    print '========================================'
    --Agregar los atributos a mostrar
    WHILE @@FETCH_STATUS=0
    BEGIN
    print @IdPro+space(4)+@Cat+space(4)+@Prod+space(4)+@Sto
    FETCH CURSOR_PRODUCTO into @IdPro, @Cat, @Prod, @Sto
    END
    CLOSE CURSOR_PRODUCTO
    DEALLOCATE CURSOR_PRODUCTO

    lunes, 6 de mayo de 2019 2:58

Respuestas

  • Error de conversión al convertir el valor varchar 'Lacteos' al tipo de datos int.

    Explicación de por qué ocurre ese error:

    Cuando usas el símbolo "+" entre dos números, significa "sumar". Cuando lo usas entre dos cadenas de texto significa "concatenar". ¿Y si lo usas entre medias de un número y una cadena (u otro tipo de dato)? Entonces SQL Server aplica las reglas de precedencia entre tipos y convierte los dos lados de la expresión al mismo tipo para poder operar con ese tipo. Y las reglas de SQL dicen que el INT tiene preferencia frente al VARCHAR, por lo que intenta convertir el varchar en int (y no el int en varchar como esperaría alguien que esté acostumbrado a trabajar en otros lenguajes tales como C#, donde la conversión es la contraria a la de SQL). Obviamente, si el varchar contiene algo que no se puede convertir en número ('Lacteos' en este caso), se produce un error.

    La solución es usar CAST o CONVERT sobre el INT antes de concatenarlo con el VARCHAR. En una respuesta anterior te han puesto un ejemplo usando CONCAT, aunque también funcionará si sigues usando el "+" a condición de que metas antes la conversión sobre los INT.

    lunes, 6 de mayo de 2019 6:27

Todas las respuestas

  • Hola Michael_CS20:

    Tienes que utilizar cast en la salida.

    DROP TABLE IF EXISTS dbo.producto;
    
    DROP TABLE IF EXISTS dbo.categoria;
    
    CREATE TABLE producto
    (idproducto INT
    , idcat      INT
    , nombre     VARCHAR(30)
    , stock      INT
    , estado     CHAR(1)
    );
    
    CREATE TABLE categoria
    (idCategoria INT
    , nombre      VARCHAR(50)
    , estado      CHAR(1)
    );
    GO
    
    INSERT INTO producto
    (idproducto
    , idcat
    , nombre
    , stock
    , estado
    )
    VALUES
    (1, 1, 'camisaA', 10, 'a'),
    (2, 1, 'camisaB', 10, 'b');
    GO
    INSERT INTO dbo.categoria
    (idCategoria
    ,nombre
    ,estado
    )
    VALUES
    (1, 'CATEGORIA', 'A');
    GO
    
    /* Hasta aquí sólo era para recrear tu escenario */
    
    DECLARE @IdPro INT, @Cat VARCHAR(50), @Prod VARCHAR(30), @Sto int;
    
    DECLARE CURSOR_PRODUCTO CURSOR
    FOR SELECT IdProducto
    	    , c.Nombre AS Categoria
    	    , p.Nombre AS Producto
    	    , Stock
        FROM   
    	    PRODUCTO p
    		    INNER JOIN categoria c ON c.IdCategoria = p.IdCat;
    
    OPEN CURSOR_PRODUCTO;
    
    FETCH CURSOR_PRODUCTO INTO @IdPro, @Cat, @Prod, @Sto;
    --Imprimir la cabezera de mi cursor
    
    PRINT 'Codigo    Categoria    Producto    Stock';
    
    PRINT '========================================';
    --Agregar los atributos a mostrar
    
    WHILE @@FETCH_STATUS = 0
        BEGIN
    	   PRINT CONCAT(CAST(@IdPro AS VARCHAR(10)), SPACE(4), @Cat, SPACE(4), @Prod, SPACE(4), CAST(@Sto AS VARCHAR(10)));
    	   FETCH CURSOR_PRODUCTO INTO @IdPro, @Cat, @Prod, @Sto;
        END;
    
    CLOSE CURSOR_PRODUCTO;
    
    DEALLOCATE CURSOR_PRODUCTO;

    Salida

    Codigo    Categoria    Producto    Stock
    ========================================
    1    CATEGORIA    camisaA    10
    2    CATEGORIA    camisaB    10

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 6 de mayo de 2019 14:35
    lunes, 6 de mayo de 2019 4:22
  • Error de conversión al convertir el valor varchar 'Lacteos' al tipo de datos int.

    Explicación de por qué ocurre ese error:

    Cuando usas el símbolo "+" entre dos números, significa "sumar". Cuando lo usas entre dos cadenas de texto significa "concatenar". ¿Y si lo usas entre medias de un número y una cadena (u otro tipo de dato)? Entonces SQL Server aplica las reglas de precedencia entre tipos y convierte los dos lados de la expresión al mismo tipo para poder operar con ese tipo. Y las reglas de SQL dicen que el INT tiene preferencia frente al VARCHAR, por lo que intenta convertir el varchar en int (y no el int en varchar como esperaría alguien que esté acostumbrado a trabajar en otros lenguajes tales como C#, donde la conversión es la contraria a la de SQL). Obviamente, si el varchar contiene algo que no se puede convertir en número ('Lacteos' en este caso), se produce un error.

    La solución es usar CAST o CONVERT sobre el INT antes de concatenarlo con el VARCHAR. En una respuesta anterior te han puesto un ejemplo usando CONCAT, aunque también funcionará si sigues usando el "+" a condición de que metas antes la conversión sobre los INT.

    lunes, 6 de mayo de 2019 6:27
  • No se si esto es una tarea estudiantil, pero no creo que sea necesario usar un cursor para lo que deseas hacer.

    Con la SELECT es suficiente.

    En cuanto a tu error, usa la funcion CONCAT para evitar las conversiones explicitas.

    ...
    PRINT CONCAT(@IdProd, SPACE(4), @Cat, SPACE(4), @Prod, SPACE(4), @Sto);


    AMB

    Some guidelines for posting questions...

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

    lunes, 6 de mayo de 2019 12:09
  • gracias
    lunes, 6 de mayo de 2019 15:15
  • gracias
    lunes, 6 de mayo de 2019 15:15
  • gracias
    lunes, 6 de mayo de 2019 15:15