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

Sql server 是否可以通过在DTExec命令行中传递不同的值来覆盖通过表达式计算的变量值?,sql-server,ssis,dtexec,Sql Server,Ssis,Dtexec,是否可以通过在DTExec命令行上传递不同的值来覆盖SSIS包中通过表达式计算的变量值 我有一个参数化查询,并将变量User::StartDate传递给它。包名为openairport.dtsx 如果我从PowerShell使用DTExec调用我的包,我可以在命令行上设置StartDate变量fine。例如: & "C:\Program Files\Microsoft SQL Server\150\DTS\Binn\DTExec.exe" -File 'OpenAir

是否可以通过在DTExec命令行上传递不同的值来覆盖SSIS包中通过表达式计算的变量值

我有一个参数化查询,并将变量
User::StartDate
传递给它。包名为openairport.dtsx

如果我从PowerShell使用DTExec调用我的包,我可以在命令行上设置StartDate变量fine。例如:

& "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"

当下游系统出现故障时,您可以明确更改赋值中的值和补丁,以便使用。

您正在覆盖它。问题是,每次读取/使用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命令代码。以前是:

    声明@StartDateTime日期时间=

    声明@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, 0, 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
    将被设置为
    StartDate
    和/或
    EndDate
    变量值修改:

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

  • 在SSIS包的OLE DB源代码中,我修改了接收传入参数的SQL命令代码。以前是:

    声明@StartDateTime日期时间=

    声明@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, 0, 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小时