在SQL中添加计算列

时间:2013-12-11 08:41:23

标签: sql sql-server

如何添加计算所选列总和的计算列。

这就是我所做的但是有错误..

ALTER TABLE dbo.tblEM_Reimbursement
ADD [Amount] AS (SELECT SUM(Total) FROM dbo.tblEM_ReimbursementEntry WHERE ReimbursementID = ReimbursementID)

它说

  

Msg 1046,Level 15,State 1,Line 2
  在此上下文中不允许子查询。只允许使用标量表达式。

提前致谢

2 个答案:

答案 0 :(得分:0)

您可以使用用户定义的功能。 未经测试的代码如下。

CREATE FUNCTION dbo.Get_ReimbursementEntry (@ReimbursementID int)
RETURNS DECIMAL(10,2)
AS BEGIN
    RETURN (SELECT SUM(Total) FROM dbo.tblEM_ReimbursementEntry WHERE ReimbursementID = ReimbursementID)
END
GO

ALTER TABLE dbo.tblEM_Reimbursement
ADD [Amount] AS (dbo.Get_ReimbursementEntry (ReimbursementID))
GO

但要注意性能影响

答案 1 :(得分:0)

您可以使用TriggerTrigger是一个用PL/SQL编写的自动函数 之后之前特定事件。

阅读this tutorial以便更好地理解。

对于SQL-Server,请阅读thisthis

示例

CREATE TABLE Employee_Test
(
    Emp_ID INT Identity,
    Emp_name Varchar(100),
    Emp_Sal Decimal (10,2)
)

INSERT INTO Employee_Test VALUES ('Anees',1000);
INSERT INTO Employee_Test VALUES ('Rick',1200);    
INSERT INTO Employee_Test VALUES ('John',1100);
INSERT INTO Employee_Test VALUES ('Stephen',1300);
INSERT INTO Employee_Test VALUES ('Maria',1400);

假设您有另一张表:

CREATE TABLE Employee_Test_Audit
(
    Emp_ID int,
    Emp_name varchar(100),
    Emp_Sal decimal (10,2),
    Audit_Action varchar(100),
    Audit_Timestamp datetime
)

在表上插入INSERT后触发此触发器。让我们创建触发器:

CREATE TRIGGER trgAfterInsert ON [dbo].[Employee_Test] 
FOR INSERT
AS
declare @empid int;
declare @empname varchar(100);
declare @empsal decimal(10,2);
declare @audit_action varchar(100);

select @empid=i.Emp_ID from inserted i; 
select @empname=i.Emp_Name from inserted i; 
select @empsal=i.Emp_Sal from inserted i;   
set @audit_action='Inserted Record -- After Insert Trigger.';

insert into Employee_Test_Audit
       (Emp_ID,Emp_Name,Emp_Sal,Audit_Action,Audit_Timestamp) 
values(@empid,@empname,@empsal,@audit_action,getdate());

PRINT 'AFTER INSERT trigger fired.'
GO