【问题标题】:How to write a trigger on a table when duplicate records are inserting and then insert those records into anothe table插入重复记录时如何在表上编写触发器,然后将这些记录插入到另一个表中
【发布时间】:2014-01-22 12:49:14
【问题描述】:

我正在做 VB 加载和 SSIS 加载。这样就可以将这些负载中的数据插入到数据库表中。我需要查找是否有任何重复记录插入到表中。如果有任何重复记录进入表中,那么我需要在插入重复记录时触发触发器,并且我需要将相同的记录插入到另一个表中。

例如 y VB 加载或 SSIS 加载正在向 Table1 中插入记录。所以我需要查找是否有任何重复记录插入到 table1 中。如果插入,那么我需要触发触发器,并且需要将该重复记录插入 Table2。

请提出解决方案。 非常感谢您的帮助。 提前致谢

【问题讨论】:

    标签: sql-server ssis


    【解决方案1】:

    您最好的选择是在表上创建一个INSTEAD OF INSERT 触发器。

    在触发器中,您可以检查记录是否已存在并将其插入到另一个表中或继续插入。

    【讨论】:

      【解决方案2】:

      这是一个代替触发器的示例。我假设您只想要每个副本的一份副本。 (我假设 'Name' 是 LoadTable 中用于检测重复项的唯一键)

      CREATE TRIGGER tCheckDupes ON LoadTable INSTEAD OF INSERT
      AS BEGIN
          INSERT INTO DupesTable(Name)
              SELECT DISTINCT i.Name FROM INSERTED i
                  INNER JOIN LoadTable lt
                  ON lt.NAME = i.NAME;
      
          -- Because this is an instead of trigger, you need to do the actual insert as well.
          INSERT INTO LoadTable(Name)
              SELECT Name FROM INSERTED i;
      END
      

      Fiddle here

      【讨论】:

      • 您还应该在LoadTable 上的插入中添加一些条件,以避免插入重复记录。
      • OP 没有提到任何关于不将重复项插入加载表的内容,尽管这可能是一项要求。顺便说一句,我已经 +1 了你的答案。
      • 我的桌子上有近 80-90 列。如果行中的每一列都相同,则应将其视为重复。我的问题是在插入副本时应该触发触发器。这意味着如果表中已经存在一行并且相同的数据通过 SSIS 加载插入到表中,则应该触发触发器并且该行必须插入到另一个表中。注意:我对触发器很陌生跨度>
      • 触发器不是conditional - 如果不适用,最好提前退出。 w.r.t. 90 cols,我强烈建议在插入数据之前计算数据的哈希值,然后将哈希值包含在加载表中。这样,触发器可以只检查哈希,而不必比较 90 列。您的数据肯定具有某种形式的幂等性(例如事务 ID 或类似的?)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 2017-08-01
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多