【问题标题】:Creating a trigger that replaces null values in an insert with values already present in the table in SQL Server创建一个触发器,将插入中的空值替换为 SQL Server 表中已存在的值
【发布时间】:2020-01-14 13:02:45
【问题描述】:

我有一张表,称为Fruit_Veg_Product_Table,用于包含某些水果和蔬菜库存的特征。

该表有以下列:

Product_ID
Product_Type
Product_Name
Product_Colour
Product_Price
Product_In_Sale
Product_Stock_Level
Product_Height
Product_Width
Product_Depth
Product_Package_Height
Product_Package_Width
Product_Package_Depth

当一个新产品插入到表中时,有时插入的产品没有任何维度(从Product_Height 一直到Product_Package_Depth 的列)。在这种情况下,尺寸输入为 NULL。

我需要一个 SQL Server 触发器,它将尝试插入的所有 NULL 值替换为与表中已存储的产品相对应的值,这些产品与正在输入的产品共享一个公共 Product_Type .

非常感谢任何有关此问题的帮助。

【问题讨论】:

  • 如果有多个匹配的产品并且尺寸不匹配怎么办?
  • 为什么不首先阻止人们插入NULL?或者,如果水果有固定尺寸,请将它们存放在其他地方。
  • @GordonLinoff 实际上我可能应该提到这一点,好问题!您可以假设在这种情况下,如果产品共享一个 Product_Type,那么它们的大小都是相同的,我想这会更容易。
  • 这看起来像是一个规范化问题。如果可以从产品类型可靠地推断出尺寸,则它们应该在产品类型表中
  • 然后把它传给可以的人。如果您可以创建触发器,但无法修复设计,那么问题在于谁能修复设计;从长远来看,触发只会让情况变得更糟。

标签: sql sql-server triggers


【解决方案1】:

触发器有一个 INSERTED 逻辑表,可用于将插入的行数据连接回物理表。这是一个例子:

CREATE TRIGGER Fruit_Veg_Product_Table_Trg
ON dbo.Fruit_Veg_Product_Table
FOR INSERT
AS
UPDATE dbo.Fruit_Veg_Product_Table
SET Product_Package_Height = ca.Product_Package_Height,
    Product_Package_Width = ca.Product_Package_Width,
    Product_Package_Depth = ca.Product_Package_Depth
FROM dbo.Fruit_Veg_Product_Table
    CROSS APPLY
(
    SELECT TOP 1
           Product_Package_Height,
           Product_Package_Width,
           Product_Package_Depth
    FROM dbo.Fruit_Veg_Product_Table AS fvpt
    WHERE dbo.Fruit_Veg_Product_Table.Product_Type = fvpt.Product_Type
          AND Product_Package_Height IS NOT NULL
          AND Product_Package_Width IS NOT NULL
          AND Product_Package_Depth IS NOT NULL
) AS ca
WHERE EXISTS
(
    SELECT *
    FROM INSERTED
    WHERE INSERTED.Product_ID = dbo.Fruit_Veg_Product_Table.Product_ID
          AND INSERTED.Product_Package_Height IS NULL
          AND INSERTED.Product_Package_Width IS NULL
          AND INSERTED.Product_Package_Depth IS NULL
);

GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多