我需要创建一个 SQL 作业。
Step1: 在TaskToProcess表中插入一行并返回ProcessID(PK and Identity)
Step2:取回step1 生成的ProcessID,将值传递给SSIS包,执行SSIS包。
这在 SQL Server JOB 中可能吗?
请帮助我
提前致谢。
我需要创建一个 SQL 作业。
Step1: 在TaskToProcess表中插入一行并返回ProcessID(PK and Identity)
Step2:取回step1 生成的ProcessID,将值传递给SSIS包,执行SSIS包。
这在 SQL Server JOB 中可能吗?
请帮助我
提前致谢。
没有在作业步骤之间传递变量值的内置方法。但是,有几个解决方法。
一种选择是在步骤 1 结束时将值存储在表中,并在步骤 2 中从数据库中查询回来。
听起来您是ProcessID
通过插入表并返回SCOPE_IDENTITY()
插入行的值来生成的。如果作业步骤 1 是插入此表的唯一进程,您可以使用该IDENT_CURRENT('<tablename>')
函数从作业 2 中检索最后插入的值。
编辑
如果多个进程可以插入到您的进程控制表中,最好的解决方案可能是将步骤 1 和 2 重构为一个步骤 - 可能使用可以在步骤之间传递变量的控制 SSIS 主包(或其他等效技术)。
类似于Ed Harper 的回答,但在“工作步骤中的变量”MSDN 论坛帖子中找到了一些详细信息
对于工作环境,某些流程键控表(使用 job_id)或全局临时表似乎最有用。当然,我意识到您可能不想让某些东西“全球”可用。如有必要,您还可以考虑加密或混淆您存储的值。使用后请务必删除该行。
进程键控表在文章“如何在存储过程之间共享数据”中进行了描述
Send parameters to SQL server agent jobs/job steps MSDN forum thread to create a table to hold the parameters中的另一个建议,例如:
CREATE TABLE SQLAgentJobParms
(job_id uniqueidentifier,
execution_instance int,
parameter_name nvarchar(100),
parameter_value nvarchar(100),
used_datetime datetime NULL);
您的调用存储过程将获取传递给它的参数并将它们插入到 SQLAgentJobParms。之后,它可以使用 EXEC sp_start_job。而且,如前所述,作业步骤将从 SQLAgentJobParms 中进行选择以获取必要的值。