none
Problema al guardar Decimales en la BD RRS feed

  • Pregunta

  • Saludos

     

    Tengo en una BD una tabla que entre otros campos tiene este:

     

    CALIFICACION (decimal(4,2),NULL)

    Quiero almacenar numeros del tipo 5,3   10,0    1,34   , es decir calificaciones de un alumno

     

    Al ejecutar mi procedimiento almacenado

     

    USE [FORMACION]

    GO

    /****** Object:  StoredProcedure [dbo].[PROC_CALIFICACIONES_CrearCalificacion]    Script Date: 01/05/2011 16:00:12 ******/

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    -- =============================================

    -- Author: <Author,,Name>

    -- Create date: <Create Date,,>

    -- Description: <Description,,>

    -- =============================================

    ALTER PROCEDURE [dbo].[PROC_CALIFICACIONES_CrearCalificacion]

    @CodigoMatricula varchar(13),

    @Calificacion decimal,

    @Observaciones text

    AS

    INSERT INTO CALIFICACIONES(CodigoMatricula,Calificacion,Observaciones)

    VALUES (@CodigoMatricula,@Calificacion,@Observaciones)


    El valor que le llega en Calificacion es, segun VB.NET,    4,58D pero me lo guarda como 5,00

    ¿Por que me lo redondea?

    Un saludo!

    miércoles, 5 de enero de 2011 15:00

Respuestas

  • Hola,


    Cambia tu procedimiento a esto:

    ALTER PROCEDURE [dbo].[PROC_CALIFICACIONES_CrearCalificacion]
    
    @CodigoMatricula varchar(13),
    @Calificacion decimal (4,2),
    @Observaciones text
    
    AS
    
    INSERT INTO CALIFICACIONES(CodigoMatricula,Calificacion,Observaciones)
    
    VALUES (@CodigoMatricula,@Calificacion,@Observaciones)
    


    Espero que te sirva.


    Willy Taveras.-

    IT Learn - Learning Together

    miércoles, 5 de enero de 2011 15:14
    Moderador
  • Hola.

    Especifica el tipo de dato en la declaración del parámetro:

    alter procedure...

    @calificacion decimal(4,2),...

    También sería bueno que te asegures de que a SQL Server le llega ese valor, ejecutando el procedimiento desde el Management Studio.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    miércoles, 5 de enero de 2011 15:14
    Moderador

Todas las respuestas

  • Hola,


    Cambia tu procedimiento a esto:

    ALTER PROCEDURE [dbo].[PROC_CALIFICACIONES_CrearCalificacion]
    
    @CodigoMatricula varchar(13),
    @Calificacion decimal (4,2),
    @Observaciones text
    
    AS
    
    INSERT INTO CALIFICACIONES(CodigoMatricula,Calificacion,Observaciones)
    
    VALUES (@CodigoMatricula,@Calificacion,@Observaciones)
    


    Espero que te sirva.


    Willy Taveras.-

    IT Learn - Learning Together

    miércoles, 5 de enero de 2011 15:14
    Moderador
  • Hola.

    Especifica el tipo de dato en la declaración del parámetro:

    alter procedure...

    @calificacion decimal(4,2),...

    También sería bueno que te asegures de que a SQL Server le llega ese valor, ejecutando el procedimiento desde el Management Studio.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    miércoles, 5 de enero de 2011 15:14
    Moderador
  • Ya me extrañaba a mi que me fallara

    Se me habia pasado ponerle el tipo al parametro

     

    Muchas gracias a los dos (habeis contestado practicamente a la vez)

    miércoles, 5 de enero de 2011 16:49
  • Es buena practica especificar siempre la logitud, precision, y escala de los tipos de datos que usas.

    ALTER PROCEDURE [dbo].[PROC_CALIFICACIONES_CrearCalificacion]
    @CodigoMatricula varchar(13),
    @Calificacion decimal,
    @Observaciones text
    AS
    ...

    Para que entiendes lo que esta ocurriendo, fijate cuales son los valores por defecto, de precision y escala, que usa SQL Server en este caso.

    DECLARE @d1 decimal, @d2 decimal(4, 2);
    
    SELECT @d1 = 4.58, @d2 = 4.58;
    
    SELECT
     @d1 AS [@d1],
     SQL_VARIANT_PROPERTY(CAST(@d1 AS sql_variant), 'BaseType') AS [@d1_BaseType],
     SQL_VARIANT_PROPERTY(CAST(@d1 AS sql_variant), 'Precision') AS [@d1_Precision],
     SQL_VARIANT_PROPERTY(CAST(@d1 AS sql_variant), 'Scale') AS [@d1_Scale],
     @d2 AS [@d2],
     SQL_VARIANT_PROPERTY(CAST(@d2 AS sql_variant), 'BaseType') AS [@d2_BaseType],
     SQL_VARIANT_PROPERTY(CAST(@d2 AS sql_variant), 'Precision') AS [@d2_Precision],
     SQL_VARIANT_PROPERTY(CAST(@d2 AS sql_variant), 'Scale') AS [@d2_Scale];
    GO
    
    Resultado:
    
    @d1 @d1_BaseType @d1_Precision @d1_Scale @d2 @d2_BaseType	@d2_Precision @d2_Scale
    5  decimal	 18	    0	    4.58 decimal	4	   2
    


    AMB

    Some guidelines for posting questions...

    miércoles, 5 de enero de 2011 16:57