同时远程多次执行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'';
我有一个 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'';