多次运行相同的代码会导致主键约束错误

时间:2016-06-21 03:51:45

标签: ssis sql-server-2012

我有一些SSIS软件包在加载之前都调用名为Refresh Exchange Rates的软件包,因为其他软件包依赖于刷新的汇率。

“汇率”表具有主键约束以防止重复输入。有时,Refresh Exchange Rates包将一次运行多次,因为多个包调用相同的代码。以下是运行的代码,但是在多次运行时会产生主键约束:

TRUNCATE TABLE dbo.FactExchangeRate
INSERT INTO dbo.FactExchangeRate (
  FromCurrencyId,
  ToCurrencyId,
  RateDate,
  ExchangeRate
) 
SELECT
  FromDimCurrency.Id AS FromCurrencyId,
  ToDimCurrency.Id AS ToCurrencyId,
  CAST(AXCURD.DT AS DATE) AS RateDate,
  AXCURD.EXRATE AS ExchangeRate
FROM
  DataWarehouseRawData.dbo.AXCURD
INNER JOIN
  dbo.DimCurrency FromDimCurrency ON
  FromDimCurrency.SourceKey = AXCURD.FRAXCURIDX
INNER JOIN
  dbo.DimCurrency ToDimCurrency ON
  ToDimCurrency.SourceKey = AXCURD.TOAXCURIDX

我该怎么做才能防止这种情况发生? 我知道代码运行了多次(在这个例子中是3次),所以我猜这与事务等有关。

我尝试在插页上使用TABLOCKX,将TRUNCATE更改为DELETE(针对交易),并尝试了BEGIN TRANSACTION等但最终导致陷入僵局。

2 个答案:

答案 0 :(得分:0)

听起来你只需要将你的时间空间分开,这样包裹就不会在彼此之上运行。这些包是在一个sql server作业下配置还是有多个作业?如果是后者,请尝试将作业分开5-10分钟,以便完成每个作业的时间。如果所有包都在一个作业下,那么将包拆分为单独的作业步骤,并确保步骤按顺序运行。

答案 1 :(得分:0)

我的建议是根据数据是否已存在来插入OR更新。

SSIS - Insert new rows, update rows