微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以通过在DTExec命令行中传递其他值来覆盖通过表达式计算的变量值?

如何解决是否可以通过在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"

当下游系统发生故障时,您可以显式更改分配中的值和补丁,以便使用它。

,

我能够进行以下修改:

  1. 摆脱为变量StartDate和EndDate设置的表达式。最初,我将这些值保留为空白,但是在保存并重新打开程序包后,我发现SSIS将这些值默认为1899年12月30日。非常奇怪的日期(为什么不是1899年12月31日,甚至不是1900年1月1日,对应于SQL Server DATETIME的0日期)数据类型?)。但是,有些谷歌搜索显示给我,其他人发现SSIS使用相同的默认日期。所以这不是我偶然地设置的东西;

  2. 在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;

如果没有在命令行上显式设置StartDateEndDate变量,则将在运行这些包之后运行该程序包。 SQL查询中的@StartDateTime默认为昨天00:00小时,查询中的@EndDateTime默认为一天之后,今天上午00:00。

如果我确实在命令行上显式设置了StartDate和/或EndDate变量,则SQL查询中的@StartDateTime@EndDateTime将被设置为{ {1}}和/或StartDate变量值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。