I finally decided to use CTE in this trigger after reading Sql Documentation and googling:
CREATE TRIGGER [trUpdateOrderTotal]
ON [dbo].[OrderDetail]
FOR DELETE, INSERT, UPDATE
AS
BEGIN
Declare @evt Int = 0;
SET NOCOUNT ON
IF(EXISTS(SELECT * FROM inserted))
IF(EXISTS(SELECT * FROM deleted))
IF(@Evt = 1) -- inserted
begin
With SubTotal(OrderID, SubTotal) As
(
SELECT OD.OrderID, SUM(COALESCE(OD.Total, 0)) As SubTotal FROM OrderDetail OD
WHERE OD.OrderID IN (SELECT Distinct(OrderID) From inserted)
GROUP BY OD.OrderID
)
UPDATE O SET O.OrderTotal = S.SubTotal
FROM [Order] O JOIN SubTotal S ON S.OrderID = O.OrderID
end
if(@Evt = 2) -- deleted
begin
With SubTotal(OrderID, SubTotal) As
(
SELECT OD.OrderID, SUM(COALESCE(OD.Total, 0)) As SubTotal FROM OrderDetail OD
WHERE OD.OrderID IN (SELECT Distinct(OrderID) From deleted)
GROUP BY OD.OrderID
)
UPDATE O SET O.OrderTotal = S.SubTotal
FROM [Order] O JOIN SubTotal S ON S.OrderID = O.OrderID
end
if(@Evt = 3) -- updated
begin
With SubTotal(OrderID, SubTotal) As
(
SELECT OD.OrderID, SUM(COALESCE(OD.Total, 0)) As SubTotal FROM OrderDetail OD
WHERE OD.OrderID IN (SELECT Distinct(OrderID) From inserted WHERE COLUMNS_UPDATED(Total) = 1)
GROUP BY OD.OrderID
)
UPDATE O SET O.OrderTotal = S.SubTotal
FROM [Order] O JOIN SubTotal S ON S.OrderID = O.OrderID
end
END