为了获得所描述的,你应该使用下面的T-SQL代码的计算字段:
create table dbo.Enrolement
(
StudentID int not null,
ModuleNUmber int not null,
Grade1 nchar(3) not null,
Grade2 nchar(3) not null,
Grade3 nchar(3) not null,
Overall as cast(((Grade1/10 * 2) + (Grade2/10 * 3) + (Grade3/10 * 5)) as nchar(10))
)
不过,我不明白为什么要存储的等级为文本。更重要的是,您的T-SQL代码要求将文本隐式转换为数字,进行计算,然后再次将其恢复为文本。而且,在转换过程中,您不会告诉SQL转换的内容。所以,如果你有小数位的成绩,那么表中的SELECT
将失败。
insert into dbo.Enrolement
(
StudentID,
ModuleNUmber,
Grade1,
Grade2,
Grade3
)
values (
2, -- StudentID - int
101, -- ModuleNUmber - int
N'1.2', -- Grade1 - nchar(3)
N'1.8', -- Grade2 - nchar(3)
N'3.9' -- Grade3 - nchar(3)
)
select *
from dbo.Enrolement
消息245,级别16,状态1,行17转换转换 当nvarchar的值 '1.2' 为数据类型int失败。
所以,我非常推荐你使用数字来存储你的成绩,如果他们以后用于计算。以下是相同的表用数字来代替:
create table dbo.Enrolement
(
StudentID int not null,
ModuleNUmber int not null,
Grade1 decimal(9, 3) not null,
Grade2 decimal(9, 3) not null,
Grade3 decimal(9, 3) not null,
Overall as ((Grade1/10 * 2) + (Grade2/10 * 3) + (Grade3/10 * 5))
)
我已选择使用decimal(9,3)
因为任何精度为1〜9使用相同的存储量(字节)。与此同时,我将小数位数限制为三位,因此允许小数点后两位取整。同时,有足够的空间可以“添加”等级(如果这应该是有道理的)总计999999.999
谢谢你好,先生,我有点困惑,所以我用nchar作为它可以存储数值(显然也包括文本)。什么是最好的数据类型,数字?数据类型说数字(18,0)18和零代表什么?显然它们可以改变,但是它与可以输入的最高和最低值有什么关系? – ceefax12
我建议使用'decimal(9,3)'。这将在逗号前存储小数点后三位数字和6(9减3)位数字。因此,任何给定等级的最高存储值可以是'999999.999'。有关更多信息,请参阅以下内容:https://msdn.microsoft.com/en-us/library/ms187746.aspx – Ralph
ahh我看到了,非常感谢您的帮助:) – ceefax12