【问题标题】:Persist a variable value in SSIS package在 SSIS 包中保留变量值
【发布时间】:2014-01-16 04:16:13
【问题描述】:

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

我写过这样的代码

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

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

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

有人可以帮忙吗?

【问题讨论】:

  • 为什么不将该值存储在“历史”表中?
  • 这是最佳做法吗?那样做?我只是不想在数据库中放置一个额外的表以使包正确运行。它只是对包的另一个依赖。
  • 嗯,创建历史记录表以跟踪您的包每次运行及其结果始终是一个好习惯。带有少量列的额外表应该不是问题。我还是有点不清楚你对这个日期值的要求。
  • @SaUce 我有一个 http 站点,在那里我得到了一些压缩的 csv 文件(名称 +“”+ .zip)。他们每周都放那个。我需要拉入并处理 csv 文件。我只需要将上次检查的日期保存在某处...

标签: sql-server ssis


【解决方案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;

【讨论】:

  • 这会有所帮助。谢谢。我希望,有人会发布一种在运行之间保持变量值的简单方法。
  • SSIS 从能够利用表驱动方法中受益匪浅。不想添加表可能是一个有效的问题,但我无法用足够的热情表达创建一个小模式来跟踪我的 ETL 流程是多么有用。使用这样的结构,您可以记录时间、参数、结果和任何其他您可以弄清楚如何从 SSIS 运行中提取的内容,然后快速排除故障并自动化监控,否则会过于繁琐。请记住,SSIS 是一种数据库工具,应数据库一起使用以获得最大效果!
  • @Avarkx 除非您实际在某些 Web 服务之间集成,但不一定是 SQL Server。
【解决方案2】:

您需要一个脚本任务来直接操作 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

【讨论】:

  • @CodeWeed 你能帮我理解为什么这很可怕吗?它不会解决您的情况(假设您使用的是 XML 配置)吗?
  • 我从来没有说过这不是一个肮脏的黑客。它确实解决了这种情况,不是吗?
  • @billinkc:问题是配置文件与软件包松散耦合,我没有其他方法读取配置文件路径。 DBA 管理员或 IT 管理员可以将配置文件放在 sql 机器中的任何位置。我没有很好的方法知道扩展脚本任务中的 xml 配置在哪里。此外,该包稍后可以与其他包一起使用,并且它们可以覆盖配置条目(使用 /Config 或 /SET)。它会重新编写配置文件,我最终会丢失我从脚本任务中写入配置文件的内容。我不希望以后发生这种情况。
  • 有很多我们不知道的信息,因此无法制定解决这些未说明问题的答案。
  • @ckuhn203 更好,我只需要在脚本任务之前添加一个其他任务。我仍然认为应该有一种直接的方式来坚持价值观。
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
相关资源
最近更新 更多