如何解决是否可以通过在DTExec命令行中传递其他值来覆盖通过表达式计算的变量值?
是否可以通过在DTExec命令行上传递其他值来覆盖通过表达式计算的SSIS包中的变量值?
我有一个参数化查询,正在向其中传递变量User::StartDate
。程序包名称为OpenAirExport.dtsx。
如果我使用PowerShell中的DTExec调用程序包,则可以在命令行上将StartDate变量设置为精细。例如:
& "C:\Program Files\Microsoft sql Server\150\DTS\Binn\DTExec.exe" -File 'OpenAirExport.dtsx' `
-Set '\Package.Variables[User::StartDate].Properties[Value];2020-09-22'
这很好。从结果数据中可以看到,开始日期确实设置为2020年9月22日。
99%的时间中,程序包将仅获取前一天的数据。因此,我在StartDate变量上设置了一个表达式来计算其值:
DATEADD("day",DATEDIFF("day",(DT_DBTIMESTAMP)0,GETDATE()) - 1,(DT_DBTIMESTAMP)0)
(这个看起来很复杂的表达式只是计算从第0天开始的天数,然后将它们加到第0天并减去1。这是sql Server中从日期时间中剥离时间,仅保留日期的相当标准的方式。在这种情况下,它将提供昨天的00:00小时的日期时间)
现在,如果我使用PowerShell中的DTExec调用软件包而不设置StartDate变量值,它将给出正确的结果-昨天的数据。
每时每刻,下游流程都会失败,因此我们被要求重新运行前一天的数据。因此,我希望能够使用从命令行传入的值来覆盖StartDate的计算值。但是我发现,如果尝试从命令行设置该值,该值将被忽略,并且该表达式仍用于计算StartDate。
有什么方法可以强制SSIS使用从命令行传入的值覆盖表达式值?
解决方法
您正在覆盖它。问题在于,每次读取/使用表达式时都会对en表达式求值,以便程序包启动,指定值应该是什么,然后当任务/组件使用该值时,执行引擎会说“哦,StartDate上面有一个表达式。如果值已更改,让我们对其进行评估”
一个更简单的选择是从@StartDate中完全删除该表达式。设置为最小(或最大)日期值,如果该软件包在您的Posh脚本的标准机制之外运行,则永不执行任何操作。有了故障保险,您的标准起点就开始了
-Set '\Package.Variables[User::StartDate].Properties[Value];$RunDate'
其中$ RunDate是预先计算的。
$RunDate = Get-Date -Format "yyyy-MM-dd"
# If we need to manually adjust start date,uncomment this line and use the right date
# $RunDate = "2020-09-22"
当下游系统发生故障时,您可以显式更改分配中的值和补丁,以便使用它。
,我能够进行以下修改:
-
摆脱为变量StartDate和EndDate设置的表达式。最初,我将这些值保留为空白,但是在保存并重新打开程序包后,我发现SSIS将这些值默认为1899年12月30日。非常奇怪的日期(为什么不是1899年12月31日,甚至不是1900年1月1日,对应于SQL Server DATETIME的0日期)数据类型?)。但是,有些谷歌搜索显示给我,其他人发现SSIS使用相同的默认日期。所以这不是我偶然地设置的东西;
-
在SSIS包的OLE DB源中,我修改了接收传入参数的SQL Command代码。以前是:
DECLARE @StartDateTime DATETIME =?;
DECLARE @EndDateTime DATETIME =?;
我将其更改为:
DECLARE @DefaultDateTime DATETIME = '1899-12-30';
DECLARE @StartDateParameter DATETIME = ?;
DECLARE @StartDateTime DATETIME = @StartDateParameter;
IF COALESCE(@StartDateParameter,@DefaultDateTime) = @DefaultDateTime
BEGIN;
-- Default to 00:00 hours yesterday.
SET @StartDateTime = DATEADD(day,DATEDIFF(day,GETDATE()) - 1,0);
END;
DECLARE @EndDateParameter DATETIME = ?;
DECLARE @EndDateTime DATETIME = @EndDateParameter;
IF COALESCE(@EndDateParameter,@DefaultDateTime) = @DefaultDateTime
BEGIN;
-- Default to 1 day after start date.
SET @EndDateTime = DATEADD(day,1,@StartDateTime);
END;
如果没有在命令行上显式设置StartDate
和EndDate
变量,则将在运行这些包之后运行该程序包。 SQL查询中的@StartDateTime
默认为昨天00:00小时,查询中的@EndDateTime
默认为一天之后,今天上午00:00。
如果我确实在命令行上显式设置了StartDate
和/或EndDate
变量,则SQL查询中的@StartDateTime
和@EndDateTime
将被设置为{ {1}}和/或StartDate
变量值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。