2016-08-13 46 views
1

嗨我写一个程序转换一个整数为十进制,但每当我执行过程我得到这个错误:转换int在程序十进制

Msg 8115, Level 16, State 8, Procedure gradesInsert, Line 9
Arithmetic overflow error converting numeric to data type numeric.

Msg 8115, Level 16, State 8, Procedure gradesInsert, Line 10
Arithmetic overflow error converting numeric to data type numeric.

这是我创建的表。

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 [email protected], 
     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 

我想要的学生平均有两个数字点和规模两个地方小数点像前(99.43)的右左。

我不知道我在这里失踪的家伙,但我会感激你的诚实意见和反馈。

谢谢你们!

回答

5

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

DECIMAL(precision, scale) 

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

所以decimal(2,2)指:a 总2的位数,它们的2 小数点后。

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

阅读所有关于decimal and numeric types细节在MSDN上的SQL Server .....

+0

感谢您的链接 –

0

我找到了一种方法来解决它。似乎要在右边有两个地方的十进制数字,在左边有两个或多个地方的十进制数字;您必须设置精度为五(5)和二(2)的小数位数。例如, myNmber十进制(5,2)

记住从精度值中减去比例值。因此,在上面的示例中,从精度值5(5)中减去2(2)的比例值得出的值为3(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 

它工作正常的家伙。