Чтобы получить вычисляемое поле, как описано, вы должны использовать следующий код 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.
person
Ralph
schedule
07.03.2016