如何在Calalog中执行SSIS包后读取变量值?

问题描述 投票:0回答:1

我试图从存储过程中执行一个SSIS包,我想获得在SSIS包中定义的一个变量的值。我可以执行包,但我不知道如何获得执行后的变量值。

我是这样执行包的。

-- Create the execution object
DECLARE @execution_id BIGINT
EXEC [SSISDB].[catalog].[create_execution] 
    @package_name=N'package.dtsx'
    , @project_name=N'my_project'
    , @folder_name=N'packages'
    , @use32bitruntime=False
    , @reference_id=NULL
    , @execution_id=@execution_id OUTPUT

-- System parameters
EXEC [SSISDB].[catalog].[set_execution_parameter_value] 
    @execution_id
    , @object_type = 50                     -- System parameter
    , @parameter_name = N'SYNCHRONIZED'
    , @parameter_value = 1

DECLARE @PATH AS VARCHAR(100)
SET @PATH='c:\results\test.xlsx'

EXEC [SSISDB].[catalog].[set_execution_property_override_value] 
  @execution_id = @execution_id,
  @property_path = '\package.Variables[User::FILE_PATH].Properties[Value]',
  @property_value = @PATH,
  @sensitive = 0; 

-- Execute the package
EXEC [SSISDB].[catalog].[start_execution] @execution_id

-- Check package status, and fail script if the package failed
IF 7 <> (SELECT [status] FROM [SSISDB].[catalog].[executions] WHERE execution_id = @execution_id)
RAISERROR('The package failed. Check the SSIS catalog logs for more information', 16, 1)

我的包把一个值写到一个叫ID的变量里 我需要得到这个值。有什么方法可以做到这一点吗?

sql-server ssis sql-server-2014
1个回答
1
投票

如果是我需要经常处理的事情,我会创建一个自定义表。像这样

CREATE TABLE dbo.PackageRunLog
(
    PackageControlSK int IDENTITY(1, 1) NOT NULL 
,   PackageName varchar(100) NOT NULL
,   PackageID uniqueidentifier NOT NULL
,   ExecutionID bigint NULL
,   MyCustomVariable int
};

作为包的最后一步,有一个执行SQL任务,对表进行插入。

INSERT INTO dbo.PackageRunLog VALUES (?, ?, ?, ?);

在参数部分,使用以下SSIS变量。

  • System::PackageName
  • System::PackageID
  • System::ServerExecutionID
  • User::MyVariable

前两个记录了包的友好名称,第二个是与你的包关联的内部指南。这在有人有一个通用名称的包LoadData与你的包LoadData相匹配的情况下,会很有帮助。或者如果包名变了,什么的。

神奇的是System::ServerExecutionID这个值。 在SSISDB.catalog.operations, catalog.operation_messages等中记录的执行_idoperation_id。

最后,我们把我们的SSIS变量MyVariable映射进去。

我的实际运行日志有startstop日期,insertupdatedelete计数,但这是一般的模式。

我的Lazy方法是在脚本任务中触发一个信息事件,然后从sssdb.catalog.operation_messages中解析出结果值

© www.soinside.com 2019 - 2024. All rights reserved.