我有33个SSIS程序包,目前我通过全天运行的不同批处理文件来计划,我正在寻找易于维护的解决方案。由于我的组织仅允许DBA使用SQL Server代理,因此我着眼于每次循环访问带有变量User :: PCKG和User :: RUN的结果集的过程,该结果集将拆分包的名称以及是否应使用该包是否运行取决于上一次运行的时间和时间。然后,想法是使用优先级约束(@ [User :: RUN
0)来确定程序包是否应该运行以运行所讨论的程序包,并以编程方式向执行程序包任务提供要运行的程序包的文件位置。] >--FAKESCHDL
SELECT 'PCKG1' as PCKG
,cast('08:00:00' as time) as SCHDL
INTO #FAKESCHDL
INSERT INTO #FAKESCHDL
SELECT 'PCKG2' as PCKG
,cast('18:00:00' as time) as SCHDL
--FAKELOG
SELECT 'PCKG1' as PCKG
,cast('2019-11-16' as date) as RUN_DT
INTO #FAKELOG
INSERT INTO #FAKELOG
SELECT 'PCKG2' as PCKG
,cast('2019-11-16' as date) as RUN_DT
--QUERY
SELECT a.PCKG
,case when a.SCHDL <= cast(getdate() as time) and b.RUN_DT < cast(getdate() as date) then 1
when b.RUN_DT < dateadd(d,-1,cast(getdate() as date)) then 1
else 0
end as RUN
FROM #FAKESCHDL as a
LEFT JOIN #FAKELOG as b
on a.PCKG = b.PCKG
--DROP TABLES
DROP TABLE #FAKESCHDL
DROP TABLE #FAKELOG
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForWrite("User::PCKG");
string path = @"C:\Users\thisuser\source\repos\Integration Services Project2\Integration Services Project2\";
string PCKG = path + (string)varCollection["User::PCKG"].Value + ".dtsx";
Dts.Connections["PCKG"].ConnectionString = PCKG;
Dts.TaskResult = (int)ScriptResults.Success;
}
优先约束似乎工作正常,我遇到的问题是使用C#以编程方式修改连接字符串。我认为这可能是一个简单的语法问题,或者也许我需要做一些事情来使Dts.Connection [“ PCKG”]。ConnectionString可读写,但是由于我认为大多数人都对我想做的事有更好的解决方案,使用服务器代理,似乎没有很多东西可以回答这个问题。
根据SSIS引擎的设计,程序包任务无法直接修改连接管理器或其他程序包属性。因此,“连接管理器”属性在“脚本任务”中为只读。您可以做些什么来解决问题:
MyPath
PCKG
上,将属性ConnectionString
的表达式设置为MyPath
变量MyPath
var正确值这将执行以下操作-表达式任务将在变量中创建完整路径,并且每次SSIS引用PCKG
Connection Manager时,SSIS都会将MyPath
变量的内容替换为Conn Manager的连接字符串。