首页 > 解决方案 > 创建一个触发器,将插入中的空值替换为 SQL Server 表中已存在的值

问题描述

我有一张桌子,被称为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这些产品与正在输入的产品共享一个共同点。

非常感谢您对此问题的任何帮助。

标签: sqlsql-servertriggers

解决方案


触发器有一个 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

推荐阅读