SQL Server批量插入/更新:检查记录是否存在源中的重复项

时间:2013-04-08 17:36:21

标签: sql-server triggers bulkinsert sql-merge

我有以下表连接idProduct = id(一对一):

产品

  • idProduct
  • 描述

ProductKeys

  • ID
  • 的ProductKey

我需要在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;

1 个答案:

答案 0 :(得分: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,那将是理想的。