同时多次远程执行SSIS包

时间:2015-01-20 20:52:27

标签: c# .net sql-server ssis sql-server-2008-r2

我有一个ASP.NET应用程序,我想同时执行多次SSIS包(包可能需要一段时间才能执行,我希望能够在第一个实例完成之前启动另一个实例)。 Web服务器与SQL Server不在同一服务器上,并且未安装SQL Server或SSIS。

我可以通过将它包装在SQL作业并使用sp_start_job来执行SSIS,但由于SQL作业不能同时运行两次,所以这对我不起作用。

From what I understand,如果没有客户端的特殊安装,.NET无法直接启动SSIS,这是我没有的。而且我不能在SQL服务器上安装特殊的远程处理程序。

根据这些限制,知道如何做到这一点吗?我有很多其他可以探索的解决方法,但如果可以,我想使用SSIS。

SQL Server 2008R2和.NET 4.5

修改

我找到了一些使用xp_cmdshell的解决方案,我认为它不会因为这似乎是一个安全问题 - 或者通过动态创建工作,执行它,然后删除它,但是用户帐户无权在服务器上创建作业。

2 个答案:

答案 0 :(得分:3)

您应该能够从存储过程启动程序包。具体来说,我会看一下catalog.create_execution方法。然后只需从ASP.NET调用存储过程。

以下MSDN文档可能有所帮助:Deploy and Execute SSIS Packages using Stored Procedures

编辑:以上内容仅适用于SQL Server 2012及更高版本。对于较旧的,您可能需要使用DTExec从命令行运行SSIS包,这也可以通过存储过程实现。

请参阅以下内容:Executing a SSIS Package from Stored Procedure in SQL Server

答案 1 :(得分:1)

您不能让同一个SQL代理作业运行多次,所以为什么不作弊呢?

如果您拨打sp_start_jobsp_add_job然后调用sp_start_job

,该怎么办?

由于我已指定delete_level = 1,因此作业将在成功执行后自行删除。

根据以下作业定义,添加一个GUID或类似于IAmUnique末尾的繁荣,唯一作业名称,您可以同时运行它们。

DECLARE @jobId binary(16)
EXEC msdb.dbo.sp_add_job
    @job_name = N'IAmUnique'
,   @enabled = 1
,   @notify_level_eventlog = 0
,   @notify_level_email = 2
,   @notify_level_netsend = 2
,   @notify_level_page = 2
,   @delete_level = 0
,   @category_name = N'[Uncategorized (Local)]'
,   @owner_login_name = N'EU\u001899'
,   @job_id = @jobId OUTPUT;

EXEC msdb.dbo.sp_add_jobstep
    @job_name = N'IAmUnique'
,   @step_name = N'Run package'
,   @step_id = 1
,   @cmdexec_success_code = 0
,   @on_success_action = 1
,   @on_fail_action = 2
,   @retry_attempts = 0
,   @retry_interval = 0
,   @os_run_priority = 0
,   @subsystem = N'SSIS'
,   @command = N'/SQL "\New Package" /SERVER "localhost\dev2008" /CHECKPOINTING OFF /REPORTING E'
,   @database_name = N'master'
,   @flags = 0;

EXEC msdb.dbo.sp_update_job
    @job_name = N'IAmUnique'
,   @enabled = 1
,   @start_step_id = 1
,   @notify_level_eventlog = 0
,   @notify_level_email = 2
,   @notify_level_netsend = 2
,   @notify_level_page = 2
,   @delete_level = 1
,   @description = N''
,   @category_name = N'[Uncategorized (Local)]'
,   @notify_email_operator_name = N''
,   @notify_netsend_operator_name = N''
,   @notify_page_operator_name = N'';