当表已满时运行SSIS包

时间:2019-04-06 16:04:09

标签: sql sql-server tsql ssis sql-server-2008-r2

我有以下过程:

  1. 外部进程填充了一个名为staging_table的登台表。
  2. 触发SSIS包的方法
  3. SSIS包执行业务逻辑并截断staging_table
  4. 然后该过程再次开始。

外部进程不在特定时间执行,因此创建作业在特定时间运行不是解决方案。我希望程序包在表被填充时执行。填表后是否可以执行SSIS包?如果可能的话,那将如何工作以及需要做什么?仅供参考,SQL Server的此版本为2008 R2。

2 个答案:

答案 0 :(得分:1)

  

“我希望程序包在表被填充时执行”

这有点含糊,但是您可以创建AFTER INSERT TRIGGER

create trigger staging_table_trigger
on staging_table after insert as
begin
    Declare @execution_id bigint;
    EXEC [SSISDB].[catalog].[create_execution] @package_name=N'Package.dtsx',
        @execution_id=@execution_id OUTPUT,
        @folder_name=N'Deployed Projects',
        @project_name=N'Integration Services Project1',
        @use32bitruntime=False,
        @reference_id=Null;

    --params if any
    DECLARE @var0 smallint = 1
    EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,
       @object_type=50,
       @parameter_name=N'LOGGING_LEVEL',
       @parameter_value=@var0;

     -- run package
     EXEC [SSISDB].[catalog].[start_execution] @execution_id;
end

Run an SSIS package from SSMS with Transact-SQL


请注意,此机制不适用于高度一致的OLTP系统,在这种情况下,您应该考虑使用SERVICE BROKER进行异步处理。

更多信息:Advanced Service Broker Sample: Asynchronous Triggers by Eitan Blumin

答案 1 :(得分:0)

有多种方法可以实现此目的。这是我已经实现了几次的方法。

这取决于在SSIS包末尾被截断的表。

向您的SSIS包中添加一个https://management.azure.com/subscriptions?api-version=2014-04-01,以对表执行行计数。将该计数返回到SSIS变量。让Execute SQL Task后面的Precedent Constraint检查变量的值,并且如果计数大于零,则仅继续执行包逻辑的其余部分。否则,就停在那里。

然后只安排合理的时间运行作业。如果每天都填充表格,则可能每隔几个小时运行一次作业。如果每小时填充一次,则可能每隔几分钟运行一次作业。

对空表上的记录进行计数的开销很小,因此过多的运行不会对您的环境造成负面影响。