在SQL中添加计算列

在SQL中添加计算列,sql,sql-server,Sql,Sql Server,如何添加计算选定列总和的计算列 这就是我所做的,但有一个错误 ALTER TABLE dbo.tblEM_Reimbursement ADD [Amount] AS (SELECT SUM(Total) FROM dbo.tblEM_ReimbursementEntry WHERE ReimbursementID = ReimbursementID) 上面说 味精1046,第15级,状态1,第2行 在此上下文中不允许子查询。只允许使用标量表达式 提前感谢您可以使用用户定义的功能未经测试代码如下

如何添加计算选定列总和的计算列

这就是我所做的,但有一个错误

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

味精1046,第15级,状态1,第2行
在此上下文中不允许子查询。只允许使用标量表达式


提前感谢

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

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

但是要注意性能影响

您可以使用
触发器
Trigger
是一个用调用的PL/SQL编写的自动函数 在特定事件之后或之前

阅读以便更好地理解

用于SQL Server的读和写操作

示例

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
)
此触发器在表上插入后触发。让我们将触发器创建为:

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

嗯,这个错误信息对我来说似乎是清楚易懂的。不允许您访问计算列中其他表中的数据。(甚至同一表格中的其他行)不。。所以我需要使用函数。。我经常遇到计算列中函数的问题,因为我以后无法修改它。就我个人而言,在这种情况下,我会看看视图(可能已索引)是否满足要求。Damien是对的:视图中的联接会更好,因为计算列可以访问和使用同一行中的其他列,例如,
ALTER TABLE dbo.Invoice ADD GrandTotal AS Total+Tax+Freight
但它无法引用表中的其他行我已经尝试过这个方法,但是如果我以后修改这个函数,我总是会遇到问题。两个表中的每个表上至少有一个触发器,而不是一个UDF或(更好)一个联接/视图,这是不可取的。