0

在我的应用程序中,我有一个名为“每日异常报告”的报告,用于显示 ISA 的异常情况。在此表中,我看到重复的条目(报告中完全相同的两个行)。

技术细节。

异常报告将与具有重复条目的table调用中可用的数据一起显示。用来排入的ExceptionFirstReported就是在。Insert StatementinsertExceptionFirstReportedstored procedure usp_Refresh_Daily_Exception_Report

INSERT INTO ExceptionFirstReported(
       InvestorReference, ExceptionReason, First_Reported_Date, RelativeRef)
  SELECT InvestorReference, ExceptionReason, Dateupdated, RelatedInvRef FROM (
      SELECT * FROM DailyExceptionReport As DER
               WHERE NOT EXISTS
                 (SELECT ExcepRptd.InvestorReference
                  FROM ExceptionFirstReported AS ExcepRptd
                  WHERE DER.InvestorReference = ExcepRptd.InvestorReference
                  AND DER.ExceptionReason = ExcepRptd.ExceptionReason
                  AND DER.RelatedInvRef = ExcepRptd.RelativeRef))
  AS CI
  JOIN currentISAs AN CI.InvestorReference = Status_Inv_Ref

我们认为此语句在两个不同的实例中不能有重复的条目,因为不会有具有相同InvestorReference的行ExceptionReason和 `RelatedInvRef.

但是,我们有重复的输入。这是insert用于将行插入到table. 并且这些表格DailyExceptionReport之前currentISAs没有包含重复项。

上述插入查询已在存储过程“usp_refresh_dailyreport”中调用,并且 SP 在一个周期中仅执行一次。

@returnvalue = 执行 usp_refresh_dailyreport

如果@返回值 = 1

然后

InvestorReference ExceptionReason First_reported_dt
Recent_reported_dt relativeref report_gen_date

442643169642 零余额 2012-04-11 09:54:00
2012-05-04 23:58:00 NULL

442643169642 > 一个 ISA 2012-04-21 06:30:00 2012-04-23 23:58:00 452750423823 NULL

442643169642 > 一个 ISA 2012-04-21 06:30:00
2012-04-23 23:58:00 452750423823 NULL

上面的'ExceptionFirstReported'表数据中的家伙最后两行是相同的,并且包含相同的relativeref(非空)。抱歉,“relativeref”不是空字段,但我可能会像第一行一样保留空白数据。

4

1 回答 1

1

您是否在多个线程中同时运行此插入?两个线程都可以运行存在检查,什么也找不到,然后插入相同的数据。

我建议您添加唯一索引以确保 100% 确保您没有插入重复记录。最好有一个(可操作的)异常而不是损坏的数据。

您可以通过使我们的语句在事务隔离级别可序列化下运行来解决此问题。

于 2012-05-03T17:42:12.960 回答