【问题标题】:I need help writing SQL Server trigger我需要帮助编写 SQL Server 触发器
【发布时间】:2016-07-01 00:25:58
【问题描述】:

我已经简化了Entity Model 以显示与我的问题相关的表格

我需要在Packings 上触发AFTER INSERT。

我希望它为Packings 的INSERTED 行中的所选混合中包含的每种咖啡类别更新dRoastedStocks 表的相应行中的数量。

数量应计算为:

"NewOne" = "OldOne" - "Capacity of selected package" * "Ratio of CoffeeSort in selected Mix" * "Number of packages"

在这里,我已经使用实体框架在 C# 中实现了它,它运行良好,如果有人可以将它变成 SQL Server 触发器,我将非常感激它

(NewPacking 指的是添加的行)

//For each CoffeeSort included into selected Mix
foreach (var mixDetail in NewPacking.Mix.Mix_Details)
{
    // Find row in dRoastedStocks which refers to CoffeeSort
    var roastedStock = _context.dRoastedStocks.First(x => x.CoffeeSort.Id == mixDetail.CoffeeSort.Id);
    // Update it's quantity with new value by substracting packed quantity
    // Packed quantity is calculated as "Capacity of selected package" * "Ratio of CoffeeSort in selected Mix" * "Number of packages"
    roastedStock.Quantity -= NewPacking.PackQuantity * mixDetail.Ratio/100 * NewPacking.Package.Capacity;
}

解释起来很复杂,所以我希望方案能有所帮助

编辑:这是我尝试用 SQL 编写的内容,它与我之前编写的 C# 几乎相同

CREATE TRIGGER RoastedStocks_Insert_Packing
ON Packings
AFTER INSERT 
AS
    UPDATE dRoastedStocks
    SET dbo.dRoastedStocks.Quantity = 
          dbo.dRoastedStocks.Quantity - 
             (SELECT Ratio 
              FROM Mix_Details 
              WHERE Mix_Id = (SELECT INSERTED.Mix_Id FROM INSERTED)
                AND Mix_Details.CoffeeSort_Id = dRoastedStocks.CoffeeSort_Id) / 100
             * (SELECT INSERTED.PackQuantity FROM INSERTED)
             * (SELECT Capacity FROM Packages WHERE Id = (SELECT INSERTED.Package_Id FROM INSERTED))

【问题讨论】:

  • 还有,是MySQL还是MS SQL Server?
  • @Squirrel 是 SQL Server,不便之处敬请见谅。你是什​​么意思我尝试了什么?我尝试用 SQL 编写它,但失败了。我包含了有问题的代码,但我认为它没有任何用处
  • 请告诉我们您的触发代码。
  • @Squirrel 我已经做过了:)
  • 因此您正试图根据触发器保持库存水平最新。通常最好在事后立即解决这个问题(即在视图中),因为如果由于某种原因触发器失败或有人手动更新您的余额,一切都会完全失控。或者,我建议您创建一个在事务中执行这两项操作的存储过程

标签: sql sql-server triggers insert


【解决方案1】:

由于这里发布的许多触发器也没有意识到一次插入许多行的情况。所有这些子查询都会因“标量...但返回许多行”错误而失败。

看看这个方法:

UPDATE rs SET
  Quantity -= md.Ratio / 100 * i.PackQuantity * pk.Capacity
FROM INSERTED i
INNER JOIN dbo.Mix_Details md
   ON md.Mix_Id = i.Mix_Id
INNER JOIN dbo.Packages pk
   ON pk.Id = i.Package_Id
INNER JOIN dbo.dRoastedStocks rs
   ON rs.CoffeeSort_Id = md.CoffeeSort_Id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多