在SQL中自动设置字段值

时间:2010-08-02 13:38:35

标签: sql sql-server

我有一个带有两个表的SQL Server 2008数据库。第一个表叫做Department。第二个表称为Ticket。这两个表定义如下:

Department
----------
ID
Name
TotalTickets

Ticket
------
ID
DepartmentID
Description
AssignedTo

我正试图找出一种动态更新Department.TotalTickets值的方法。添加或删除故障单时,我想自动增加或减少TotalTickets的值。有人可以告诉我在SQL Server 2008上执行此操作的最佳方法吗?

谢谢

6 个答案:

答案 0 :(得分:2)

有很多方法可以实现这一点,您可以在票证表上插入或删除后使用触发器,或者可以从部门中取出TotalTickets并将其放在视图中。

CREATE VIEW viewDepartmentTickets
AS 
  SELECT d.Id, d.Name, Sum(t.ID) As TotalTickets
  FROM Department d
  LEFT OUTER JOIN Ticket t ON t.departmentid = d.departmentid
  GROUP BY d.Id, d.Name

如果性能有问题,您可以将视图创建为indexed view,因为Thomas指出连接需要是INNER JOIN,表名需要采用{{1}格式你必须创建视图dbo.Department以沿着这条路走下去。

视图将在插入/删除票证时更新。

答案 1 :(得分:1)

一种解决方案是使用Triggers更新TotalTicketsINSERTUPDATE来自您的DELETE行表

您还可以创建View,以便使用聚合函数计算Tickets列。这是一种更加规范化的方法,因为您不会在表中存储计算字段。

答案 2 :(得分:1)

将TotalTickets列更改为计算列,创建一个udf,根据部门ID计算TotalTickets,并将TotalTickets值设置为此udf。

这样你既不需要三个触发器也不需要两个命令。

在这里查看示例:Using UDFs in Computed Columns

您也可以使用带有计算列的索引,如其他答案中所述。

答案 3 :(得分:0)

您应该在事务中插入Ticket表和Department表:

Begin Tran

Insert Ticket(Id...)
Values(@DepartmentId, ...)

Update Department
Set TotalTickets = TotalTickets + 1
Where Id = @DepartmentId

Commit Tran

这显然是一个简单的例子。在实际情况中,您可能希望添加Try-Catch块并在发生错误时调用Rollback Tran。

答案 4 :(得分:0)

如果您想自动执行此操作,那么触发器是您最好的选择。

您可以在触发器中执行两种操作:

您在INSERT和DELETE上的触发器可以

  • 增加或减少门票数量(更快,但如果触发器在某些条件下不触发,可能导致错误答案)

OR

  • 计算门票数量并发布值(更慢,但更可靠)

答案 5 :(得分:0)

只需使用它可以按照您的需要执行的触发器。非常快,但在生产中部署之前一定要调试好触发器。