我试图从存储过程中执行一个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的变量里 我需要得到这个值。有什么方法可以做到这一点吗?
如果是我需要经常处理的事情,我会创建一个自定义表。像这样
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变量。
前两个记录了包的友好名称,第二个是与你的包关联的内部指南。这在有人有一个通用名称的包LoadData与你的包LoadData相匹配的情况下,会很有帮助。或者如果包名变了,什么的。
神奇的是System::ServerExecutionID这个值。是 在SSISDB.catalog.operations, catalog.operation_messages等中记录的执行_idoperation_id。
最后,我们把我们的SSIS变量MyVariable映射进去。
我的实际运行日志有startstop日期,insertupdatedelete计数,但这是一般的模式。
我的Lazy方法是在脚本任务中触发一个信息事件,然后从sssdb.catalog.operation_messages中解析出结果值