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

Nat*_*afa 1 sql-server types stored-procedures

嘿家伙我写了一个程序将整数转换为十进制,但每当我执行该程序时,我得到这个错误:

消息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)
)
Run Code Online (Sandbox Code Playgroud)

这是程序及其调用方式.

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
Run Code Online (Sandbox Code Playgroud)

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

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

多谢你们!!

mar*_*c_s 5

一个定义DECIMAL在SQL Server列定义为:

DECIMAL(precision, scale)
Run Code Online (Sandbox Code Playgroud)

where precision表示总位数,以及scale小数点后的位数.

所以decimal(2,2)意味着:总共 2位数,其中小数点后 2位.

有了这个声明,您可以从基本上只存储值.00到.99该列中.这真的是你想要/需要的吗?

在MSDN上阅读有关SQL Server中十进制和数字类型的所有详细信息.....