我有以下过程:
staging_table
的登台表。 staging_table
。外部进程不在特定时间执行,因此创建作业在特定时间运行不是解决方案。我希望程序包在表被填充时执行。填表后是否可以执行SSIS包?如果可能的话,那将如何工作以及需要做什么?仅供参考,SQL Server的此版本为2008 R2。
答案 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
检查变量的值,并且如果计数大于零,则仅继续执行包逻辑的其余部分。否则,就停在那里。
然后只安排合理的时间运行作业。如果每天都填充表格,则可能每隔几个小时运行一次作业。如果每小时填充一次,则可能每隔几分钟运行一次作业。
对空表上的记录进行计数的开销很小,因此过多的运行不会对您的环境造成负面影响。