2016-05-31 118 views
0

我想创建一个SQL存储过程,计划每天运行,它负责将数据插入到SQL表中Table BTable A其中有一个唯一的索引列在Table B中命名为Change_ID。 但某些情况下,选择查询从源表Table A返回的​​已经存在于目标表Table B中,在这种情况下插入失败,因为过程抛出Cannot insert duplicate key row in object 'dbo.TableB' with unique index并且作业被中止。处理具有唯一索引异常的列的重复键插入

在上述情况下,我试图捕获异常,并进行表B上的删除删除重复和表A.插入行

我有以下查询,可我知道一个更好处理这种情况的方式。

BEGIN TRY 
     insert into TableB 
     ( change_id 
      , item_id  
      , class 
      , subclass  
      , start_date 
      , end_date 

     )  
     select 
      change_id 
      , item_id  
      , class 
      , subclass  
      , start_date 
      , end_date 
     from openquery(ORA,'select * from TableA where start_date >= next_day(trunc(sysdate)-5,''MONDAY'')') 
END TRY 
BEGIN CATCH 
-- 
END CATCH 
+0

添加'那里不是从表B到表A查询B选择重点exists';那么你就不会碰到重复键错误。 – xQbert

+0

另请参阅:http://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-update – PaulF

+0

@xQbert那么,作为一个表现,我认为最好不要检查每一列的重复项。相反,我认为处理异常提供了更好的性能,但不确定 – DoIt

回答

0

您可以在插入后重复尝试。 也许这为您服务;)

MySql on duplicate

+1

我不想更新任何重复的东西,只是想删除并插入新的行,我想这样做只有当有重复键异常。另外我不认为我可以在TSQL中使用重复 – DoIt

相关问题