【问题标题】:SSIS Job , passing the value in job stepsSSIS Job ,在作业步骤中传递值
【发布时间】:2020-07-23 20:06:19
【问题描述】:

我有一个包含多个步骤的 SSIS 作业,每个步骤都来自不同的包或项目。 当我执行作业时,我使用 guid 在 db 中写入日志,但每个 guid 都是在其包或项目中创建的。 我需要为所有步骤更新相同的值,将所有步骤与一个值/ID 链接在一起。 有什么建议吗?

【问题讨论】:

    标签: sql ssis sql-server-data-tools sqlpackage


    【解决方案1】:

    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

    【讨论】:

    • 感谢您的详细解释并提供不同的选项。我已经实现了它,它按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多