我创建了一个SSIS包,从各种来源提取数据并根据业务需要对其进行聚合。此处理的目标是创建单个表,例如“Data_Tableau”。此表是已连接Tableau仪表板的数据源。
Tableau仪表板在处理过程中需要可用,因此我不会截断“Data_Tableau”并重新填充SSIS包。相反,SSIS包步骤创建“Data_Stage”。然后包的最后一步是删除/重命名,其中我将“Data_Tableau”和sp_rename“Data_Stage”拖放到“Data_Tableau”。
USE dbname
DROP TABLE Data_Tableau
EXEC sp_rename Data_Stage,Data_Tableau
在最后一步之前,我希望“Data_Stage”中的max(buydate)大于“Data_Tableau”中的max(buydate),因为“Data_Stage”自上次进程运行以来会有额外的记录。
但是,有时上游数据存在问题,我最终从“Data_Tableau”中的“Data_Stage”= max(buydate)获得max(buydate)。在这种情况下,我不希望最终的放弃/重命名过程运行。相反,我希望工作失败,当我收到失败通知时,我会向相应的上游数据团队发送警报。
这是啰嗦的背景。 我的问题是 ...如何在SSIS包中检查日期并导致失败。我正在使用VS 2012.
我在考虑在最终的放弃/重命名步骤之前创建一个约束,但我之前没有创建变量或表达式,也不确定如何实现这一点。
我还在考虑按如下方式创建一个2行表:
SELECT MAX(buydate)'MaxDate','Tableau''FieldType'FROM dbname.dbo.Data_Tableau
UNION ALL
SELECT MAX(buydate)'MaxDate','Stage''FieldType'FROM dbname.dbo.Data_Stage
然后使用针对该表的查询作为某种约束,但不确定这是否有意义和/或优于创建变量/表达式的选项。
目标:如果MAX(buydate)来自“Data_Stage”>来自“Data_Tableau”的MAX(buydate),然后我想要删除/重命名步骤,否则它应该失败并且“Data_Tableau”将包含与包运行之前相同的数据。
连连呢?非常感谢逐步指导。
答案 0 :(得分:0)
我会这样做:
然后包的最后一步是删除/重命名,其中我放弃 " Data_Tableau"和sp_rename" Data_Stage"到" Data_Tableau"。
进入由SSIS包调用的存储过程。
然后,只需在代码的这一部分之前使用IF
块:
--psuedocode
IF (SELECT MaxBuyDateFromTableA) >= (SELECT MaxBuyDateFromTableB)
BEGIN
DROP TABLE Data_Tableau
EXEC sp_rename Data_Stage, Data_Tableau
END
ELSE
--do something else (or nothing at all)