通过C#代码将SSIS包作为SQLAgent作业执行,并将参数传递给SSIS包

时间:2018-06-21 08:06:26

标签: c# .net sql-server ssis ssis-2012

我需要将参数传递给SSIS包,该包正在从SQLAgent作业中执行。作业是从C#代码触发的。我无法在互联网上得到确切的答案。有可能吗?

SQLServer版本:2012

在C#中,我正在使用以下代码来开始工作。

exec msdb..sp_start_job @job_name='Upload_Job'

4 个答案:

答案 0 :(得分:4)

创建一个参数表,并将您的C#应用​​程序插入其中。然后修改您的SSIS作业,以从软件包中获取参数。在程序包中添加最后一步以清除参数表。

@ Nick.McDermaid表示担心“并行性”。如果有可能将该作业设置为快速连续运行,则可能会有“参数队列”。 SSIS程序包的第一步将使顶部参数“弹出”队列。这样,它可以一次又一次地快速运行而不会出现问题。

答案 1 :(得分:3)

SQL Agent作业是静态的-在作业/作业步骤创建时指定要执行的操作的定义。

如果需要将参数传递给作业,则SQL Agent不支持此功能。

如果您要传递的参数是有限的:更新小时,负载财务,增量处理,满负载-然后为每个方案创建一个作业并完成该任务。

如果无法绑定参数,则在SQL Agent中创建一次性作业。这使您可以指定运行所需的确切参数,而不必担心并发访问配置表。采取这种方法而不是仅运行SSISDB过程本身的原因通常涉及需要指定代理用户/凭证。

答案 2 :(得分:1)

就像一些评论中所说的那样,更好的答案是不使用代理,而是在SSISDB中调用SSIS任务本身。这意味着您可以同时运行多次任务(Agent无法执行),并且可以传递参数。

根据您的设置,您可能想要创建一个存储过程,该存储过程针对特定任务调用SSISDB中的相关SP,而不是在应用程序中全部调用它们。我认为,这样做比较容易,因为您有了更多的控制权,并且仅当软件包中的某个人发生更改时才需要更改一个位置。

这是一个示例,但是可能会帮助您理解这个想法:

USE SSISDB;
GO
--I'm going to create the SPs in a new schema in SSISDB, however, you can create this elsewhere if you want
--Create the new schema
CREATE SCHEMA app;
GO
--Create the proc, I've made up some parameters
CREATE PROC app.UploadTask @FileName sql_variant, @FileDate date, @RetryNum int AS

    DECLARE @execution_id bigint;

    --Create the execution
    EXEC [catalog].create_execution @package_name = N'UploadDocument.dtsx', --Made up package name
                                    @execution_id = @execution_id OUTPUT,
                                    @folder_name = N'FTP Packages', --Madeup name
                                    @project_name = N'FileTranfers', --Madeup Project Name 
                                    @use32bitruntime = FALSE,
                                    @reference_id = NULL;

    --Add the paramters
    EXEC [catalog].set_execution_parameter_value @execution_id = @execution_id,
                                                 @object_type = 30,
                                                 @parameter_name = N'FileName',
                                                 @parameter_value = @FileName;
    EXEC [catalog].set_execution_parameter_value @execution_id = @execution_id,
                                                 @object_type = 30,
                                                 @parameter_name = N'SubmissionDate',
                                                 @parameter_value = @FileDate;
    EXEC [catalog].set_execution_parameter_value @execution_id = @execution_id,
                                                 @object_type = 30,
                                                 @parameter_name = N'Retries',
                                                 @parameter_value = @RetryNum;

    --Set the logging level
    EXEC [catalog].set_execution_parameter_value @execution_id =  @execution_id,
                                                 @object_type = 50,
                                                 @parameter_name = N'LOGGING_LEVEL',
                                                 @parameter_value = 1;

    --This is optional, comment out or delete the following if you do not want it
    --Set the package to run synchronously
    EXEC [catalog].set_execution_parameter_value @execution_id =  @execution_id,
                                                 @object_type = 50,
                                                 @parameter_name = N'SYNCHRONIZED',
                                                 @parameter_value = 1;
    --And now, run the package
    EXEC [catalog].start_execution @execution_id;
GO

--Now a sample call:
EXEC app.UploadTask @FileName = N'\\YourFileFile\SomeShare\SomeFolder\YourFile.txt', --It's important this is a nvarchar, varchar won't work!
                    @FileDate = '20180704',
                    @RetryNum = 3;

任何问题,请问。

答案 3 :(得分:0)

为什么使用SQL Server代理作业?无法将参数传递给作业。 还有另一种执行程序包的方法:DTExec实用程序,它允许将参数传递给程序包配置:

dtexec /f "PathToMyPackage\Package.dtsx" /set \package.variables[myvariable].Value;myvalue