在SSIS包中保留变量值

时间:2014-01-15 16:36:05

标签: sql-server ssis

我有一个包含脚本任务的包。我通过编辑脚本来扩展它。 包定期运行,我需要在变量中保留日期值。该值是程序包的最后运行时间。该程序包从SQL Server代理程序运行。我已将变量放在包的配置xml中。我想从脚本任务运行我的包后更新xml中的值。

我已经编写了这样的代码

Dts.Variables["lastRunDate"].Properties["Value"].SetValue(Dts.Variables["lastRunDate"], DateTime.Now.ToString("yyyy-MM-dd");

程序运行,我只是不确定,SetValue函数的第一个参数的正确值是什么。文档没有多大帮助。脚本运行但xml配置文件未使用新值更新。

更新:我可以将值保存到注册表中。我不确定这里的最佳做法!它在SQL服务器下部署和运行包的方式存在安全问题。 :(

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

由于您是通过代理程序运行程序包,因此无法通过msdb.dbo.sysjob%表的某些组合来提取最后一次运行日期吗?

<强> msdb.dbo.sysjobactivity

SELECT  TOP 1 sja.start_execution_date
FROM    msdb.dbo.sysjobs sj
LEFT JOIN msdb.dbo.sysjobactivity sja
    ON  sj.job_id = sja.job_id
WHERE   sj.name = '<Agent Job Name>'
ORDER BY sja.start_execution_date DESC;

<强> msdb.dbo.sysjobhistory

SELECT  TOP 1 run_date, run_time
FROM    msdb.dbo.sysjobs sj
LEFT JOIN msdb.dbo.sysjobsteps sjs
    ON  sj.job_id = sjs.job_id
LEFT JOIN msdb.dbo.sysjobhistory sjh
    ON  sjs.job_id = sjh.job_id
    AND sjs.step_id = sjh.step_id
WHERE   sj.name = '<Agent Job Name>'
    AND sjs.step_name = '<Job Step Name>'
ORDER BY sjh.run_date DESC, sjh.run_time DESC;

答案 1 :(得分:0)

您需要一个脚本任务来直接操作xml配置文件。我不是xml的大师,所以可能有更好的方法,但我可以告诉你如何将文本附加到文件,所以缺少更好的解决方案,你可以用Visual Basic做到这一点。

Imports System.IO
Public Sub Main()

dim fileName as string
fileName = "C:\some\file\path\and\name.dtsconfig"
File.Delete(fileName)
File.AppendAllText(fileName, "<?xml version=" & chr(34) & "1.0" & chr(34) & "?>"
File.AppendAllText(fileName, "<DTSConfiguration><DTSConfigurationHeading></DTSConfigurationHeading>")
File.AppendAllText(fileName, "<Configuration ConfiguredType=" & chr(34) & "Property" & chr(34) & " Path = " & chr(34) & "\Package.Variables[User::lastRunDate].Properties[Value]" & chr(34) & "ValueType=" & chr(34) & "String" & chr(34) & ">")
File.AppendAllText(fileName, "<ConfiguredValue>" & DateTime.Now.ToString("yyyy-MM-dd") & "</ConfiguredValue></Configuration></DTSConfiguration>

End Sub