我还没能找到一个直截了当的答案。我想要完成的是执行一个需要设置变量的SSIS包,所以我需要通过SQL Job将这些变量传递给SSIS。我知道这可以通过" Set Values"选项卡,但我需要传递当前日期,因此硬编码字符串将无法正常工作。
是否可以将GETDATE()或其他表达式传递给Set Values中的Value字段?换句话说,"价值"字段在运行时得到评估?
如果无法做到这一点,那么将当前日期从SQL作业传递到SSIS包中的相应参数会有什么好处?
答案 0 :(得分:2)
不幸的是,没有。无法通过SQL代理作业的“设置值”屏幕将诸如GETDATE()的方法分配给datetime变量的value属性。那里的值字段必须设置为离散值。
我可以想到两种解决方法。
第一个 - 也是最简单的选项 - 是编辑包。使用BIDS / SSDT打开包,找到该变量,然后设置" Evaluate As Expression"该变量的属性为True。然后在该变量的属性窗口中,单击表达式省略号...并将表达式设置为等于GETDATE()。保存包裹。程序包运行时,该变量将计算为GETDATE()。
第二种方法需要更多的汗水,并且存在风险,但允许您动态设置SSIS包变量。而不是使用SQL Server作业来调用包。调用SP的预定作业。然后,此SP将使用xp_cmdShell和DTEXEC.exe命令行工具执行SSIS包。 这是一个example。 DTEXEC.EXE命令行工具有一个/ SET参数,它基本上与“设置值”对话框相同。但这种方式是它的动态。在SP内部你可以
DECLARE @MyDate datetime
SET @MyDate = GETDATE()
您只需将@MyDate值转换为DTEXEC的/ SET参数即可 此外,您还可以使用一个参数来代替GETDATE(),该参数允许您从%DATE%和%TIME%系统环境变量的子字符串组合在命令行上构建此日期变量。
set MyDate=%DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,8%
dtexec /FILE "\"D:\SSIS\Package1.dtsx\"" /SET "\"\Package.Variables[VarDateTime].Value\"";"\"%MyDate%\""
一个例子是here。
显然,选项一更容易,风险更小。祝你好运!
答案 1 :(得分:0)
当作业启动SSIS包时,它传递的参数必须在作业中进行硬编码。
如果您需要将更多上下文相关的值传递给包,我发现这样做的最好方法是填充数据库中的元数据表,并在工作中迈出第一步从该表中选择最新的行并从中填充变量。