【问题标题】:How to Make Dynamic Query In Triiger In Sql Server 2008如何在 SQL Server 2008 的触发器中进行动态查询
【发布时间】:2017-07-27 14:17:42
【问题描述】:

我当前的代码(这是错误的)

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

当用户更新购买账单条目时,首先检查旧条目数量是否小于或大于当前数量。然后计算新旧数量之间的差异 然后使用 if 条件更新或多或少的记录和矿井和加号

【问题讨论】:

  • 你的问题没有意义。
  • 不需要if。基本上这两种情况都在做Stock = Stock - D.Quantity + I.Quantity

标签: sql sql-server-2008 tsql database-trigger


【解决方案1】:

假设我理解这个问题,你正在寻找这样的东西:

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

【讨论】:

  • 这是帮助您理解登录的 C# 表达式... Stock = (I.Quantity > D.Quantity ? ( Stock - (I.Quantity-D.Quantity)) : ( Stock + ( D.数量 - I.数量)))
  • 您可以使用这种情况,但我认为您不应该这样做。您希望我将 case 表达式添加到答案中吗?
  • @SiddiqueBagwan - 这是一种不必要的复杂写作方式Stock = Stock - (I.Quantity - D.Quantity);。如果I.Quantity 小于D.Quantity,则I.Quantity - D.Quantity 产生一个负数,其大小正好等于D.Quantity - I.Quantity。减去一个负数就等于加上那个负数的绝对值。
【解决方案2】:
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

【讨论】:

  • 正如我在回答中试图指出的那样,这种类型的解决方案(或 Zohar 的)有一个严重的问题 - 如果更新了引用 same ProductID 的多行,这个UPDATE不会做你所期望的。它将对Product 表应用一个更新(其中一个是未知的)并忽略其他的。此外,正如人们反复试图告诉您的那样,这种条件逻辑不是必要的。在数学上,5 - (-4)已经等于5 + 4
【解决方案3】:

基于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 值的多行的更新应该发生什么。

正如 Zohar 的回答下面所评论的那样,您的条件逻辑不必要地令人费解,因为 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

Stock 已经调整了 5 - 但我们实际上调整了两行,并且 Stock 总数应该改变了 10,而不是 5。

【讨论】:

  • 没问题 :-)
猜你喜欢
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多