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
我有一个包含多个步骤的 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