我有一些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
等但最终导致陷入僵局。
答案 0 :(得分:0)
听起来你只需要将你的时间空间分开,这样包裹就不会在彼此之上运行。这些包是在一个sql server作业下配置还是有多个作业?如果是后者,请尝试将作业分开5-10分钟,以便完成每个作业的时间。如果所有包都在一个作业下,那么将包拆分为单独的作业步骤,并确保步骤按顺序运行。
答案 1 :(得分:0)
我的建议是根据数据是否已存在来插入OR更新。