2017-03-07 65 views
-2

我當前的代碼(這是錯誤的)如何使動態查詢在Triiger在SQL Server 2008

CREATE TRIGGER [dbo].[Trg_After_Update] ON [dbo].[PurchaseDetails] 
FOR UPDATE 
AS 
BEGIN 
    UPDATE Product SET Rate = I.SallingPrice, 
     [email protected] int=0; 
     --if(I.Quantity > D.Quantity) 
      [email protected] = I.Quantity - D.Quantity 
      --Stock = Stock - @Result 
     --ELSE 
      [email protected] = D.Quantity - I.Quantity 
      --Stock = Stock + @Result 
    FROM Inserted I inner join deleted D on I.DetailsID = D.DetailsID 
    WHERE ProductID = I.ProductID 
END 

當用戶更新採購紙幣入口,那麼首先Cheack無論舊條目數量比目前的數量小於或大於。再算上新老產品數量 然後更新記錄在或大或小批量,礦業和另外使用。如果條件

+1

你的問題沒有意義。 –

+1

沒有'如果'需要。基本上這兩種情況都是'Stock = Stock - D.Quantity + I.Quantity' – Serg

回答

1

假設我明白的問題之間Diffrence,您正在尋找這樣的事情:

CREATE TRIGGER [dbo].[Trg_PurchaseDetails_After_Update] ON [dbo].[PurchaseDetails] 
FOR UPDATE 
AS 
BEGIN 
    UPDATE P 
    SET Rate = I.SallingPrice, 
     Stock = Stock - D.Quantity + I.Quantity 
    FROM Product P 
    INNER JOIN Inserted I ON P.ProductID = I.ProductID 
    INNER JOIN deleted D on I.DetailsID = D.DetailsID 
END 
+0

這是C#表達式,它有助於您理解登錄... Stock =(I.Quantity> D.Quantity?(Stock - (I.Quantity -D.Quantity)):(Stock +(D.Quantity - I.Quantity))) –

+0

您可以使用此案例,但我認爲您不應該。您是否希望我將案例表達式添加到答案中? –

+0

@SiddiqueBagwan - 這是寫作'Stock = Stock - (I.Quantity - D.Quantity)'的不必要的複雜方式。如果'I.Quantity'小於'D.Quantity',那麼'I.Quantity - D.Quantity'產生一個負數,其數值恰好等於'D.Quantity - I.Quantity'。並且減去負數與添加該負數的絕對值相同。 –

0

輕微根據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.

+0

@Zohar - 道歉錯誤的名字 –

+0

沒問題:-) –

+0

謝謝兄弟爲解決方案.... –

0
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 
+0

正如我試圖指出在我的答案,這種類型的解決方案(或Zohar的)有一個壞問題 - 如果多行更新引用了*相同*'ProductID',這個'UPDATE'將*不*做你期望的。它會將一個更新應用於「產品」表(不知道哪一個)並忽略其他。而且,隨着人們反覆試圖告訴你,這個條件邏輯是*不是必需的。通過數學,「5 - (-4)'*已經*等於'5 + 4'。 –