Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SSIS包中保留一个变量值_Sql Server_Ssis - Fatal编程技术网

Sql server 在SSIS包中保留一个变量值

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"); 程

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

我已经写了这样的代码

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。