【问题标题】:Converting int to decimal in procedure在过程中将 int 转换为十进制
【发布时间】:2016-08-21 13:12:49
【问题描述】:

大家好,我编写了一个将整数转换为十进制的程序,但是每当我执行该程序时,都会出现以下错误:

消息 8115,第 16 级,状态 8,程序等级插入,第 9 行
将数值转换为数值数据类型时出现算术溢出错误。

消息 8115,第 16 级,状态 8,程序等级插入,第 10 行
将数值转换为数值数据类型时出现算术溢出错误。

这是我创建的表。

CREATE TABLE French 
(
        StudentId int Primary key,
        StudentName varchar(75),
        Class varchar (15),
        SubjectName varchar(25) DEFAULT ('Mathematics'),
        FirstPeriod int,
        SecondPeriod int,
        ThirdPeriod int,
        FirstSemesterExam int,
        FirstSemesterAvg decimal(2,2),
        FourthPeriod int,
        FifthPeriod int,
        SixPeriod int,
        SecondSemesterExam int,
        SecondSemesterAvg decimal(2,2)
)

这是过程及其调用方式。

create proc gradesInsert
    @StuId int, @p1 int, @p2 int, @p3 int, @firstExam int, 
    @p4 int, @p5 int,   @p6 int, @SecondExam int
As
    declare @add1 int = @p1 + @p2 + @p3 + @firstExam
    declare @add2 int = @p4 + @p2 + @p6 + @SecondExam

    declare @firstAvg decimal(2,2) = cast(@add1 / 4.0 as decimal(2,2))
    declare @SecondAvg decimal(2,2) = cast(@add2 / 4.0 as decimal(2,2))
begin
    update dbo.French
    Set FirstPeriod = @p1,
        SecondPeriod = @p2,
        ThirdPeriod = @p3,
        FourthPeriod =@p4,
        FirstSemesterExam = @firstExam,
        FirstSemesterAvg = @firstAvg,
        FifthPeriod = @p5,
        SixPeriod = @p6,
        SecondSemesterExam = @SecondExam,
        SecondSemesterAvg = @SecondAvg
    where 
        dbo.French.StudentId = @StuId
end



Exec gradesInsert 1, 90, 98, 77, 69, 70, 72, 99, 100

我希望学生平均值在点的左侧有两个数字,并在小数点右侧缩放两个位,例如 ex (99.43)。

我不知道我在这里缺少什么,但我会感谢你们诚实的意见和反馈。

谢谢各位!!

【问题讨论】:

    标签: sql-server stored-procedures types


    【解决方案1】:

    SQL Server 中DECIMAL 列的定义定义为:

    DECIMAL(precision, scale)
    

    其中precision 代表位数,scale 代表小数点后的位数。

    所以decimal(2,2) 表示:total 2 位数字,其中 2 小数点之后。

    使用此声明,您基本上只能在该列中存储从.00.99 的值。这真的是您想要/需要的吗?

    在 MSDN 上的 SQL Server 中阅读有关 decimal and numeric types 的所有详细信息.....

    【讨论】:

    • 感谢您的链接
    【解决方案2】:

    我找到了解决方法。似乎右边有两位小数,左边有两位或更多位;您必须以五 (5) 的精度和二 (2) 的比例设置十进制值。 前任。 myNmber 十进制(5,2)

    请记住,从精度值中减去刻度值。因此,在上面的示例中,从精度值五 (5) 中减去比例值二 (2) 得到三 (3) 值,该值可以在左侧保存任何三 (3) 位数字。这适用于除数是三位数的除法。

    如果您想进行除法,其中除数是四 (4) 位数字,那么您的字段应如下所示。前任。 myNumber 十进制(6,2)。

    因此,就我而言,我所要做的就是重新定义表中的内容,如下所示:

     FirstSemesterAvg decimal(6,2),
     SecondSemesterAvg decimal(6,2),
    

    而且在我的程序中:

    declare @firstAvg decimal(6,2) = cast(@add1 as decimal(6,2)) / 4
    declare @SecondAvg decimal(6,2) = cast(@add2 as decimal(6,2)) / 4
    

    伙计们,它工作得很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 2016-07-19
      • 2017-04-03
      • 2011-11-27
      相关资源
      最近更新 更多