我想创建一个SQL存储过程,计划每天运行,它负责将数据插入到SQL表中Table B
从Table 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
添加'那里不是从表B到表A查询B选择重点exists';那么你就不会碰到重复键错误。 – xQbert
另请参阅:http://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-update – PaulF
@xQbert那么,作为一个表现,我认为最好不要检查每一列的重复项。相反,我认为处理异常提供了更好的性能,但不确定 – DoIt