【发布时间】:2020-07-23 20:06:19
【问题描述】:
我有一个包含多个步骤的 SSIS 作业,每个步骤都来自不同的包或项目。 当我执行作业时,我使用 guid 在 db 中写入日志,但每个 guid 都是在其包或项目中创建的。 我需要为所有步骤更新相同的值,将所有步骤与一个值/ID 链接在一起。 有什么建议吗?
【问题讨论】:
标签: sql ssis sql-server-data-tools sqlpackage
我有一个包含多个步骤的 SSIS 作业,每个步骤都来自不同的包或项目。 当我执行作业时,我使用 guid 在 db 中写入日志,但每个 guid 都是在其包或项目中创建的。 我需要为所有步骤更新相同的值,将所有步骤与一个值/ID 链接在一起。 有什么建议吗?
【问题讨论】:
标签: sql ssis sql-server-data-tools sqlpackage
SQL 代理作业不允许将值传递给作业步骤。
但是,您可以重新考虑当前对 SSIS 包的调用如何实现您的目标。
如果您向 SQL 代理作业添加前导步骤会怎样? SQL 任务的类型并使用它来生成您希望包共享的 GUID。将其存储到 1 行表中或创建键/值样式的历史表。
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 代理实例生成的 guid。第二列是您的跟踪指南。
步骤 0 看起来像
declare @jobid uniqueidentifier = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID)))
-- Populate this however it needs to be done
, @myguid uniqueidentifier = newid()
您在 SSIS 的工作步骤会有所改变。您将使用 TSQL 类型并执行类似的操作,而不是使用本机 SSIS 作业步骤类型。
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 运行包,则可以在系统变量 ServerExecutionID 中进行检测。我在每个带有执行 SQL 任务的包的第一步中执行此操作。在从 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
【讨论】: