尊敬 我已经使用ASP.net界面为员工信息创建了一个表 现在我显示在我的表中添加一个操作,如下所示,
我有四列(WorkDatey
,WorkDatem
,WorkDated
,absentday
)表名称employee中整数类型的所有列。
现在我应该添加新列(realworkdays
),这里的结果应该是输入以前的数据后自动保存为例:
WorkDatey= 2011 , WorkDatem= 2 , WorkDated=14 , absentday=6
操作应为:(2011 * 365)+(2 * 30)+(14) - (6),结果将存储在列(realworkdays)中。
我已经尝试过它作为触发器,但我有一些错误:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER daysResult
ON [dbo].[employee]
AFTER insert
As
DECLARE @realworkdays int
BEGIN
SET NOCOUNT ON;
select WorkDatey,WorkDatem,WorkDated,absent from [dbo].[employee]
@realworkdays= (workdatey*350)+(workdatem*29)+(workdated)-(absent)
insert into [dbo].[employee] (totaldays)values (@realworkdays)
END
GO
答案 0 :(得分:4)
由于您使用的是sql server 2005,我建议您使用computed column
ALTER TABLE employee DROP COLUMN realworkdays;
ALTER TABLE employee ADD COLUMN realworkdays AS (
(WorkDatey * 365) +
(WorkDatem * 30) +
(WorkDated) -
(absentday)
)
您可以添加PERSISTED
,以便存储数据,也可以将其编入索引。
在旁注中,您的触发器会插入一个新行,而不是更新当前行的值。
答案 1 :(得分:0)
您应该更新插入的记录,而不是插入新记录。
因此,它应该是UPDATE
语句,您可以一次性完成计算和更新。
CREATE TRIGGER daysResult
ON [dbo].[employee]
AFTER insert
AS
BEGIN
UPDATE employee
SET realworkdays = (inserted.workdatey*350)+(inserted.workdatem*29)+
(inserted.workdated)-(inserted.absent)
FROM inserted
WHERE employee.ID = inserted.ID
END
仍然最好使用计算列,如@The Scrum Meister建议的那样。