0

我有以下表格加入 idProduct = id (一对一):

产品

  • idProduct
  • 描述

产品密钥

  • ID
  • 产品密钥

我需要在 Products 表上为单个和批量插入和更新创建触发器,该触发器根据产品描述更新产品的 ProductKeys 中的键。

如果产品有密钥,则将密钥更新为描述,否则插入新密钥。

每个产品的产品密钥必须是唯一的。

因此,如果其他产品的密钥已存在,请将 idProduct 附加到描述以创建密钥。

我的问题:

我有用于插入和更新的触发器,除了插入或更新具有相同描述的 2 种不同产品的情况。在这种情况下,为两种产品生成的密钥是相同的。

有任何想法吗?

这是我使用 MERGE 语句的触发器:

CREATE TRIGGER [dbo].[UpdateKey]
ON  [dbo].[Products] 
AFTER  INSERT, UPDATE
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

        MERGE ProductKeys [Target]
        USING 
            (
                SELECT
                    CASE 
                        WHEN pk.id IS NULL 
                            THEN i.description
                        ELSE  
                            i.description + '_' + CAST(i.idProduct AS VARCHAR)
                        END [NewProductKey]
                    , i.idProduct
                FROM
                    INSERTED i
                    LEFT OUTER JOIN ProductKeys pk ON pk.id <> i.idProduct AND pk.ProductKey = i.description
                ) [source]
        ON (target.id = source.idproduct)
        WHEN NOT MATCHED THEN 
            INSERT
                ( 
                    id
                    , ProductKey
                )
            VALUES
                (
                        source.idProduct
                        , source.NewProductKey
                )
        WHEN MATCHED THEN
            UPDATE SET
                ProductKey = source.NewProductKey;
4

1 回答 1

0

我在 INSERTED 上添加了一个 LEFT JOIN 以检查源中是否存在重复项。我的源查询现在看起来像:

SELECT
    CASE 
        WHEN pk.id IS NULL AND i2.idProduct IS NULL
            THEN i.description
        ELSE  
            i.description + '_' + CAST(i.idProduct AS VARCHAR)
        END [NewProductKey]
    , i.idProduct
FROM
    INSERTED i
    LEFT OUTER JOIN ProductKeys pk ON pk.id <> i.idProduct AND pk.ProductKey = i.description
    LEFT OUTER JOIN INSERTED i2 ON  i2.description = i.description AND i.idProduct <> i2.idProduct

这对我来说没问题 - 当源中有 2 个具有相同描述的产品时,两者都将其 id 附加到密钥中。

但是,如果有一种方法可以让第一个产品的密钥没有 id - 只是描述 - 其余的都带有 id,那将是理想的。

于 2013-04-09T18:16:46.227 回答