如何以编程方式修改平面文件连接到 SSIS 包的连接字符串?
How can I programmatically modify the connection string of a flat file connection to a SSIS package?
我有 33 个 SSIS 包,我目前通过 运行 全天不同的批处理文件安排它们,我正在寻找更易于维护的解决方案。因为我的组织只允许 DBA 使用 SQL 服务器代理,所以我着陆的是每次循环使用变量 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 正确的值,例如,在 Foreach 循环内的表达式任务中
这将执行以下操作 - 表达式任务将在变量中创建完整路径,每次 SSIS 引用 PCKG
连接管理器时,SSIS 都会将 MyPath
变量的内容替换为连接字符串康经理。
我有 33 个 SSIS 包,我目前通过 运行 全天不同的批处理文件安排它们,我正在寻找更易于维护的解决方案。因为我的组织只允许 DBA 使用 SQL 服务器代理,所以我着陆的是每次循环使用变量 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 正确的值,例如,在 Foreach 循环内的表达式任务中
这将执行以下操作 - 表达式任务将在变量中创建完整路径,每次 SSIS 引用 PCKG
连接管理器时,SSIS 都会将 MyPath
变量的内容替换为连接字符串康经理。