在过程中将int转换为十进制

时间:2016-08-13 07:24:33

标签: sql-server stored-procedures types

嘿伙计们我编写了一个将整数转换为十进制的过程,但每当我执行该过程时,我都会收到此错误:

  

Msg 8115,Level 16,State 8,Procedure gradeInsert,Line 9
  算术溢出错误将数字转换为数据类型数字。

     

Msg 8115,Level 16,State 8,Procedure gradesInsert,Line 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)。

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

谢谢你们!

2 个答案:

答案 0 :(得分:5)

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

DECIMAL(precision, scale)

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

所以decimal(2,2)表示:为2位数,其中 小数点后

通过此声明,您基本上只能在该列中存储.00.99的值。那真的你想要/需要什么?

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

答案 1 :(得分:0)

我找到了解决问题的方法。好像有一个十进制数字,右边两个地方,左边两个或多个地方;你必须设置十进制值,精度为五(5),刻度为二(2)。     防爆。 myNmber小数(5,2)

请记住,从精度值中减去比例值。因此,在上面的示例中,从精度值五(5)中减去的二(2)的比例值导致三(3)的值,其可以保持左边的任何三(3)位数。这适用于除数为三位数的除法。

如果你想进行一个除数为四(4)位数的除法,那么你的字段看起来应该是这样的。防爆。 myNumber decimal(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

它很好用。