同时远程多次执行SSIS包

Remotely execute SSIS package multiple times simultaneously

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

我可以通过围绕 SQL 作业并使用 sp_start_job 来执行 SSIS,但是由于 SQL 作业不能同时 运行 两次,所以这不会为我工作。

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

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

SQL 服务器 2008R2 和 .NET 4.5

编辑

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

您应该能够从存储过程启动程序包。具体来说,我会查看 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

您不能多次拥有相同的 SQL 代理工作 运行,那为什么不作弊呢?

而不是调用 sp_start_job, what if you called sp_add_job, sp_add_job_step 然后调用 sp_start_job

因为我指定了 delete_level = 1,作业会在成功执行后自行删除。

给定以下作业定义,在 IAmUnique 和 boom 的末尾附加一个 GUID 或类似的东西,唯一的作业名称,您可以同时 运行 它们。

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'';