【问题标题】:SQL Server Bulk Insert/Update: checking if record exists with duplicates in sourceSQL Server 批量插入/更新:检查源中是否存在重复记录
【发布时间】:2013-04-08 17:36:20
【问题描述】:

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

产品

  • idProduct
  • 说明

产品密钥

  • 身份证
  • 产品密钥

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

【问题讨论】:

    标签: sql-server triggers bulkinsert sql-merge


    【解决方案1】:

    我在 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,那将是理想的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2015-12-22
      • 2016-03-14
      • 1970-01-01
      • 2012-03-06
      • 2013-03-31
      • 1970-01-01
      相关资源
      最近更新 更多