Sql server 是否可以通过在DTExec命令行中传递不同的值来覆盖通过表达式计算的变量值?
是否可以通过在DTExec命令行上传递不同的值来覆盖SSIS包中通过表达式计算的变量值 我有一个参数化查询,并将变量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
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"
当下游系统出现故障时,您可以明确更改赋值中的值和补丁,以便使用。我可以通过进行以下修改来完成此操作:
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
变量值修改:
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小时