SSIS Job,在作业步骤中传递值

SSIS Job , passing the value in job steps

我有一个包含多个步骤的 SSIS 作业,每个步骤都来自不同的包或项目。 当我执行作业时,我使用 guid 在 db 中写入日志,但每个 guid 都是在其包或项目中创建的。 我需要为所有步骤更新相同的值,类似于 link 所有步骤和一个 value/ID。 有什么建议如何做到这一点?

SQL 代理作业不允许将值传递到作业步骤。

但是,您可以重新考虑当前对 SSIS 包的调用如何实现您的目标。

如果您在 SQL 代理作业中添加前驱步骤会怎样?输入 SQL 任务并使用它来生成您希望您的包共享的 GUID。将其存储到第 1 行 table 或创建 key/value 样式历史 table.

CREATE TABLE dbo.CorrelateAgentToSSIS
( 
    jobid uniqueidentifier NOT NULL
,   runid uniqueidentifier NOT NULL
,   insert_date datetime NOT NULL CONSTRAINT DF__CorrelateAgentToSSIS__insert_date DEFAULT (GETDATE())
);

那里有 4 列。第一个是 SQL Server Agent 生成的 guid。第二列是您的跟踪指南。

第 0 步看起来像

declare @jobid uniqueidentifier =  CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID)))
-- Populate this however it needs to be done
,    @myguid uniqueidentifier = newid()

您的 SSIS 作业步骤将略有变化。您将不使用本机 SSIS jobstep 类型,而是使用 TSQL 类型并执行类似这样的操作。

DECLARE @execution_id bigint
, @jobid uniqueidentifier = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID)));
DECLARE  @runid uniqueidentifier = (SELECT TOP 1 runid FROM dbo.CorrelateAgentToSSIS AS CATS WHERE CATS.jobid = @jobid);


EXEC SSISDB.catalog.create_execution
    @package_name = N'SomePackage.dtsx'
,   @execution_id = @execution_id OUTPUT
,   @folder_name = N'MyFolder'
,   @project_name = N'MyProject'
,   @use32bitruntime = False
,   @reference_id = NULL;

-- ddl left as exercise to the reader
INSERT INTO dbo.RunToSSIS
SELECT
    @run
,   @execution_id;

DECLARE @var0 smallint = 1;

EXEC SSISDB.catalog.set_execution_parameter_value
    @execution_id
,   @object_type = 50
,   @parameter_name = N'LOGGING_LEVEL'
,   @parameter_value = @var0;

-- This assumes you have a parameter defined in SSIS packages to receive the 
-- runid guid
EXEC SSISDB.catalog.set_execution_parameter_value
    @execution_id
,   @object_type = 50
,   @parameter_name = N'RUN_ID'
,   @parameter_value = @runid;

EXEC SSISDB.catalog.start_execution
    @execution_id;
GO

最后,在收集指标时,您可能还想考虑将作业 运行 与包在 SSISDB 中收集的数据相关联。您可以通过将 jobid/runid 记录为 execution_id 的 bigint 来弥补这一差距。如果您要从 SSISDB 运行ning 包,则可以在系统变量 ServerExecutionID 中进行探测。我在每个带有 Execute SQL Task 的包的第一步中执行此操作。在 VS 的包 运行 中,该值为 0。否则,它就是您在 SSISDB.catalog.operations 中看到的值 了解这三件事将使您能够了解代理作业的工作方式,将其与您的自定义 guid 相关联,并且无论您收集什么指标,您都可以从 SSIS 目录中提取性能数据。

https://dba.stackexchange.com/questions/13347/get-job-id-or-job-name-from-within-executing-job https://dba.stackexchange.com/questions/38808/relating-executioninstanceguid-to-the-ssisdb