Sql server 在SSIS包中保留一个变量值
我有一个包含脚本任务的包。我通过编辑脚本来扩展它。 包定期运行,我需要在变量中保留日期值。该值是上次运行包的时间。该包从SQL server代理运行。我已将变量放入包的配置xml中。我想在从脚本任务运行包后更新xml中的值 我已经写了这样的代码Sql server 在SSIS包中保留一个变量值,sql-server,ssis,Sql Server,Ssis,我有一个包含脚本任务的包。我通过编辑脚本来扩展它。 包定期运行,我需要在变量中保留日期值。该值是上次运行包的时间。该包从SQL server代理运行。我已将变量放入包的配置xml中。我想在从脚本任务运行包后更新xml中的值 我已经写了这样的代码 Dts.Variables["lastRunDate"].Properties["Value"].SetValue(Dts.Variables["lastRunDate"], DateTime.Now.ToString("yyyy-MM-dd"); 程
Dts.Variables["lastRunDate"].Properties["Value"].SetValue(Dts.Variables["lastRunDate"], DateTime.Now.ToString("yyyy-MM-dd");
程序运行时,我只是不确定SetValue函数的第一个参数的正确值是多少。这些文档并没有多大帮助。脚本将运行,但xml配置文件不会用新值更新
更新:我可以将值保存到注册表。我不确定这里的最佳实践!!!在SQL server下部署和运行包的方式存在安全问题:(
有人能帮忙吗?您需要一个脚本任务来直接操作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
Imports System.IO
公用分干管()
将文件名设置为字符串
fileName=“C:\some\file\path\and\name.dtsconfig”
File.Delete(文件名)
File.AppendAllText(文件名“”)
File.AppendAllText(文件名“”)
File.AppendAllText(文件名“”)
File.AppendAllText(文件名“&&DateTime.Now.ToString(“yyyy-MM-dd”)&”
端接头
由于您是通过代理运行包的,您不能通过一些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;
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名sja.start\u execution\u date
来自msdb.dbo.sysjobs sj
左连接msdb.dbo.sysjob活动sja
在sj.job_id=sja.job_id上
其中sj.name=“”
sja下达的订单。开始执行日期说明;
msdb.dbo.sysjobhistory
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;
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个运行日期、运行时间
来自msdb.dbo.sysjobs sj
左连接msdb.dbo.sysjobsteps sjs
在sj.job_id=sjs.job_id上
左连接msdb.dbo.sysjobhistory sjh
在sjs.job_id=sjh.job_id上
和sjs.step_id=sjh.step_id
其中sj.name=“”
和sjs.step_name=''
按sjh.run_日期描述、sjh.run_时间描述订购;
为什么不将该值存储在“历史记录”中"表?这是最佳做法吗?这样做吗?我只是不想在数据库中添加一个额外的表以使包正确运行。它只是包的另一个依赖项。创建历史记录表以跟踪包每次运行及其结果始终是一个好做法。具有很少列的额外表不应该是p问题。我仍然不清楚您对这个日期值的要求。@我有一个http站点,在那里我可以得到一些压缩的csv文件(name++.zip)。他们每周都会这样做。我需要拉入并处理csv文件。我只需要将上次检查的日期保存在某个地方…@CodeWeed你能帮我理解为什么这很可怕吗?它不能解决你的情况吗(假设你使用的是XML配置)?我从来没有说过这不是一个肮脏的黑客行为。它确实解决了这个问题,不是吗?@billinkc:问题是配置文件与包松散耦合,我没有其他方法读取配置文件路径。DBA管理员或it管理员可以将配置文件放在sql机器中的任何位置。我没有好的方法知道xml配置文件在哪里此外,该包以后可以与其他包一起使用,并且它们可以覆盖配置项(使用/Config或/SET)。它将重新写入配置文件,我将从脚本任务中丢失我写入配置文件的内容。我不希望以后发生这种情况。这是我们不了解的大量信息,因此无法制定解决这些未说明问题的答案。@ckuhn203更好,我只需要添加一个oth在脚本任务之前执行er任务。我仍然认为应该有一种直接的方法来持久化值。这会有所帮助。谢谢。我希望有人会发布一种在运行之间持久化变量值的简单方法。SSIS能够利用表驱动的方法,因此受益匪浅。不想添加表可能是一个合理的问题,但我没有足够热情来表达创建一个小模式来跟踪我的ETL过程是多么的有用。有了这样一个结构,你可以记录时间、参数、结果和任何其他你可以知道如何从SSIS运行中提取的东西,然后快速排除故障并自动监控,否则会非常麻烦请记住,SSIS是一种数据库工具,应该与数据库一起使用,以获得最大效果!@Avarkx,除非您实际在某些Web服务之间集成,而不一定是SQL Server。