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

How to read variables values after execute a SSIS package in the Calalog?

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

我是这样执行包的:

-- 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 的变量,我需要获取该值。有办法吗?

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

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 任务插入 table。

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

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

  • 系统::包名称
  • 系统::包ID
  • System::ServerExecutionID
  • 用户::我的变量

前两个记录包的友好名称,第二个是与您的包关联的内部 guid。如果有人有一个与您的包 LoadData 匹配的通用命名包 LoadData,这将很有帮助。或者如果包名称发生变化,无论如何。

神奇的是System::ServerExecutionID这个值execution_id/operation_id记录在SSISDB.catalog.operations,catalog.operation_messages等

最后,我们将 SSIS 变量 MyVariable 映射到其中。

我的实际 运行 日志有 start/stop 日期,insert/update/delete 算在内,但这是一般模式。

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