在SSISDB中,能够使用TSQL脚本执行Package;每执行一次Package,SSIS都会创建一个Operation 和一个执行实例(Execution Instance),每个Execution Instance都有唯一的标识 ExecutionID,数据类型是bigint;
有些Package在执行时,需要指定参数值,通过向执行实例传递Parameter,能够为Package的参数赋值,Package的参数分为两种类型:系统参数和Package参数,系统参数共有7个,用于控制日志记录和异步/同步执行方式等行为,而Package参数,用于向Package传递动态的参数值。
一,在SSISDB中,使用TSQL脚本和Package进行交互
1,在执行Package时,创建Package的执行实例
declare @Execution_ID bigint exec catalog.create_execution @package_name=N'Test.dtsx', @Execution_ID=@Execution_ID output, @folder_name=N'MyProjectFloder', @project_name=N'MyProject', @use32bitruntime=FALSE, @reference_id=null
该SP创建Package的执行实例,以输出(output)参数返回执行实例的ID
2,向 Package的执行实例传递参数
--set package parameter declare @var0 sql_variant=N'Package_Parameter_value'; exec catalog.set_execution_parameter_value @Execution_ID=@Execution_ID, @object_type=30, --Package parameter @parameter_name=N'Package_Parameter_Name', @parameter_value=@var0 --set system parameter declare @var1 smallint = 1 exec [SSISDB].[catalog].[set_execution_parameter_value] @execution_id=@execution_id, @object_type=50, --system parameter @parameter_name=N'LOGGING_LEVEL', @parameter_value=@var1 exec [SSISDB].[catalog].[start_execution] @execution_id
3,异步方式执行Package
exec catalog.start_execution @Execution_ID=@Execution_ID go
由于没有设置系统参数:SYNCHRONIZED,因此,该SP在执行后,不等Package执行完成,就立即返回。
二,分析代码
1,使用 catalog.create_execution 存储过程创建一个Execution Instance,创建成功之后,通过参数返回一个唯一的Execution_ID。
create_execution [ @folder_name ] = folder_name , [ @project_name = ] project_name , [ @package_name = ] package_name [ , [ @reference_id = ] reference_id ] [ , [ @use32bitruntime = ] use32bitruntime ] , [ @execution_id = ] execution_id OUTPUT
An execution is used to specify the parameter values that are a package uses during a single instance of package execution.
2,使用 catalog.set_execution_parameter_value 存储过程来修改Parameter的 Execution Value
set_execution_parameter_value [ @execution_id = execution_id , [ @object_type = ] object_type , [ @parameter_name = ] parameter_name , [ @parameter_value = ] parameter_value
For the following parameters, set object_type to 50
- LOGGING_LEVEL
- CUSTOMIZED_LOGGING_LEVEL
- DUMP_ON_ERROR
- DUMP_ON_EVENT
- DUMP_EVENT_CODE
- CALLER_INFO
- SYNCHRONIZED
3,异步执行Package
SSIS Engine 默认以异步方式执行Package,调用sp:catalog.start_execution 执行package的Execution Instance,但是,sp不等待package执行完成,就返回,返回的状态表示调用Package的结果。如果后续执行的Package必须在前一个pacakge执行完成之后才能开始运行,那么,必须以同步方式执行Package,在调用sp:catalog.start_execution 之后不会理解返回,而是等package执行完成之后,才会返回,将控制权传递到下一条TSQL 语句。
参数 SYNCHRONIZED 控制Package是以同步,还是以异步方式执行,默认值是0,通过将参数:SYNCHRONIZED 的Execution Value 修改为1,使SSIS Engine以同步方式执行Package:
exec catalog.set_execution_parameter_value @execution_id=@package_execution_instance_id, @object_type= 50, @parameter_name = N'Synchronized', @parameter_value = 1;
Synchronized 是一个特殊的Parameter,参数@object_type必须设置为50,当设置参数Synchronized的Execution Value为1,sp:catalog.start_execution 等到Package执行完成之后返回。
Appendix:
引用《Quick Tip – Run SSIS 2012 packages synchronously and other execution parameters》:
In order to call the package synchronously, and therefore keep the caller waiting until the package finishes, you have to set a parameter value to true. This parameter, SYNCHRONIZED. To call it, simply call catalog.set_execution_parameter_values before calling catalog.start_execution and set the SYNCHRONIZED parameter to true (1). Like so:
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, -- execution_id from catalog.create_execution @object_type=50, @parameter_name=N'SYNCHRONIZED', @parameter_value= 1; -- turn on synchronized execution
参考文档:
Quick Tip – Run SSIS 2012 packages synchronously and other execution parameters
catalog.create_execution (SSISDB Database)
catalog.start_execution (SSISDB Database)