使用SSIS

时间:2017-09-19 08:21:47

标签: sql-server ssis sql-server-2012

我一直在阅读乔布斯以及通过传递日期参数动态执行SSIS包的方法,我想知道我的想法是否合适。

我的要求:

  • 不同的员工可能需要能够以自己的日期执行包。
  • 员工不应该自己改变或经营工作(他们甚至不需要知道工作)。

我看到这可以通过using stored procedures and web applications to build a dynamic job .来实现虽然看起来很复杂但需要更多时间。

我的方法:使用环境变量。 I saw the last answer by the OP in this topic about changing the values of them before execution.

所以我想知道我是否能做到这一点(如果这是一个足够好的解决方案):

  • 使用环境变量
  • 构建员工可以使用的存储过程(不一定是SP,可以是Web应用程序或其他东西),并将参数发送到。
  • 存储过程将设置环境变量
  • 然后存储过程将执行一个作业,该作业执行包(通过执行作业,将使用步骤中的值?或环境变量?)

我应该更进一步采用这种方法,还是应该将其更改为另一种?

编辑:感谢@PacoDePaco answer我已经设法提出这个问题:

EXEC [SSISDB].[catalog].[create_execution] @package_name=N'CalculateReports.dtsx',
                                           @execution_id=@execution_id OUTPUT,
                                           @folder_name=N'Packages', 
                                           @project_name=N'HeshbonAmit',
                                           @use32bitruntime=False, 
                                           @reference_id=Null  

Select @execution_id  

DECLARE @var0 sql_variant = N'2017-04-01 00:00:00'  
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type=20, @parameter_name=N'startDate', @parameter_value=@var0  
DECLARE @var1 sql_variant = N'2017-07-01 00:00:00'  
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type=20, @parameter_name=N'EndDate', @parameter_value=@var1  
DECLARE @var2 sql_variant = N'2017-06-30 00:00:00'  
EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id, @object_type=20, @parameter_name=N'shiaruchDate', @parameter_value=@var2  

EXEC [SSISDB].[catalog].[start_execution] @execution_id  
GO  

但它引发了一个错误:

  

无法访问包或包不存在。验证包是否存在以及用户是否具有该权限。

项目部署在SSMS中,位于此路径:

整合服务目录 - > SSISDB - > ssis项目 - >项目 - > HeshbonAmit - >包裹 - > CalculateReports.dtsx

我的SSIS有3个类型为string的包参数 - > startDate,endDate,shiaruchDate。

我有SSIS_ADMIN规则,为什么会失败?

2 个答案:

答案 0 :(得分:2)

首先,只有一个同一作业的实例可能正在运行,因此一个用户必须等待另一个用户的工作完成。此外,如果考虑并发性,环境变量不是一个好方法 - 我希望可能存在两个用户希望在大致相同的时间用不同参数执行作业的情况。所以他们都启动过程,变量设置为任一值,并且作业成功执行但你怎么知道哪个值?

我个人会从存储过程中执行一个包而不将其放入工作中。您可以为每个包执行提供参数。你说了一些关于网络应用程序的东西,所以也许托管api会更合适的方式为你执行包。您可以很好地了解执行包here的方法。

答案 1 :(得分:1)

如果您非常了解SSIS,那么使用环境变量是一种选择。那些基本上类似于项目级变量。我们通常使用它们来定义整个SSIS项目的连接字符串设置。

然后,最大的优势是我们可以将相同的解决方案部署到不同的服务器(即开发,测试,生产),并在各个服务器上设置所需的变量。它还允许您手动调整特定设置,以防您需要尝试找出单个包在测试时工作的原因,而不是生产;您可以通过编辑该特定变量来简单地更改必要的连接字符串。

但是,对于您的场景,这听起来过于复杂,也许不切实际。当然,这一切都取决于你的技术技能,但拥有一个简单的网络界面,允许某人选择开始和结束日期应该已经成功。一旦他们选择了两个日期,然后单击“开始”,日期将作为参数提供给proc,您就可以开始了。

如果你想让它更健壮,你可以考虑添加某种队列表,其中请求以FIFO为基础记录,proc只是安排定期运行以清除队列。这可以防止几个用户同时启动proc,这可能最终导致一些阻塞问题(YMMV,它可能根本不是问题。但是,如果可以的话,我喜欢提前避免这样的东西) 。

要获得额外的奖励积分,请添加一个登录表,您可以在其中注册所调用的proc的开始时间,提供的用户名和参数以及结束时间。同样,这可能没有必要,但可以在以后帮助解决问题。