輕微根據Zohar's answer進行調整 - 我們打算根據這些購買量降低庫存水平,而不是增加。但是我們也需要考慮在處理相同的ProductID
的多行更新時會發生什麼情況。因此,我們需要在應用更新前做一些彙總,以及:
CREATE TRIGGER [dbo].[Trg_PurchaseDetails_After_Update] ON [dbo].[PurchaseDetails]
FOR UPDATE
AS
BEGIN
UPDATE P
SET Rate = I.SallingPrice,
Stock = Stock - (I.Quantity - D.Quantity)
FROM Product P
INNER JOIN
(SELECT ProductID,SUM(Quantity) as Quantity,
MAX(SallingPrice) as SallingPrice from Inserted group by ProductID) I
ON P.ProductID = I.ProductID
INNER JOIN
(SELECT ProductID,SUM(Quantity) as Quantity from deleted group by ProductID) D
on P.ProductID = D.ProductID
END
還請注意,我認爲這是正確的,從每一個產品的所有更新的值取最大值SallingPrice
值。如果這是不正確的,我們需要更清楚地說明對於影響具有相同ProductID
值的多行的更新應該發生的情況。
正如下面評論佐哈爾的答案,你的條件邏輯是不必要的令人費解,因爲4 - (5 - 7)
和4 + (7 - 5)
產生相同的結果,沒有必要切換周圍的括號內的減法和切換外操作。
要明白我與需要聚集談論,考慮下面的腳本(使用Siddique's answer):
create table dbo.Product (
ProductID int not null primary key,
Stock int not null,
Rate int not null
)
go
insert into dbo.Product(ProductID,Stock,Rate) values (1,49,5)
go
create table dbo.PurchaseDetails (
DetailsID int not null primary key,
ProductID int not null,
Quantity int not null,
SallingPrice int not null)
go
insert into dbo.PurchaseDetails (DetailsID,ProductID,Quantity,SallingPrice) values
(1,1,10,5),
(2,1,20,10)
go
CREATE TRIGGER [dbo].[Trg_After_Update] ON [dbo].[PurchaseDetails]
FOR UPDATE
AS
BEGIN
UPDATE Product SET Rate = I.SallingPrice,
Stock = (CASE
WHEN I.Quantity > D.Quantity
THEN (Stock - (I.Quantity - D.Quantity))
WHEN I.Quantity < D.Quantity
THEN (Stock + (D.Quantity - I.Quantity))
END)
FROM inserted I Inner join deleted D on I.DetailsID = D.DetailsID AND I.ProductID = D.ProductID
Where Product.ProductID = I.ProductID
END
go
update PurchaseDetails set Quantity = Quantity + 5
go
select * from Product
select * from PurchaseDetails
結果是:
ProductID Stock Rate
----------- ----------- -----------
1 44 10
DetailsID ProductID Quantity SallingPrice
----------- ----------- ----------- ------------
1 1 15 5
2 1 25 10
股票已經調整了5 - 但我們實際調整了兩排,總庫存應該已經改變了10,而不是5.
你的問題沒有意義。 –
沒有'如果'需要。基本上這兩種情況都是'Stock = Stock - D.Quantity + I.Quantity' – Serg