我有一个每天运行的SSIS包,并在Oracle数据库中执行查询。此查询仅针对新添加的记录执行,例如:
select t1.*
from info_table t1,
dates_table t2
where t1.date = (select t2.date from dates_table where (select max(id) from dates_table))
有时需要为之前的日期执行相同的包,现在我需要维护2个包。第一个从查询中获取日期,而第二个直接通过配置文件获取。是否有任何方法(可能通过创建更复杂的配置文件)根据我的需要执行相同的包?
非常感谢
是否有任何方法(可能通过创建更复杂的配置文件)根据我的需要执行相同的包?
不容易。最简单的(这是相对BTW)将有一个表的控制表,用于从中选择日期,然后您只需以SELECT将抓取的方式操作该表。这还需要重新分解SELECT查询以放弃SELECTing MAX(DATE)。如果您需要日期表来存储历史日期,那么您将需要添加另一列作为开关,用于指示要加载的日期,然后按日期升序排序。例如:
ID DateLoadInd
3/21/2019 1 -- this will load
3/20/2019 0 -- this will not load
3/19/2019 0 -- this will not load
3/18/2019 0 -- this will not load
3/17/2019 1 -- this will load
SELECT T1.*
FROM Info_Table T1
INNER JOIN Date_Table T2
ON T1.Date = T2.ID
WHERE T2.DateLoadInd = 1
ORDER BY T2.ID ASC
或者,您可以放弃加入Date_Table并仅参数化查询以通过映射到变量的包参数接收值。我不喜欢这种方法,因为它需要SQL Server确定并将日期提供给作业。我不认为可以在package参数中使用GETDATE()函数,希望它将被执行以确定日期(即,它仅作为字符串传递)。因此,您需要采取允许作业自动运行的方法,希望您可以让它在当前日期运行,除非您想要覆盖并提供特定日期。即使它确实有效,你仍然需要记住将package参数翻转回GETDATE() - 这比它的价值还要多,这就是为什么我不喜欢它而不是创建一个更复杂的配置文件。
在那个笔记上,当你说:
(也许通过创建更复杂的配置文件)
我理解,要说您使用的是旧版程序包部署模型,而不是更现代(更好的IMHO)项目部署模型。