【问题标题】:Execute an SSIS Package as a SQLAgent job from C# code and pass a parameter to the SSIS package从 C# 代码将 SSIS 包作为 SQLAgent 作业执行,并将参数传递给 SSIS 包
【发布时间】:2018-06-21 08:06:26
【问题描述】:

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

SQLServer 版本:2012

从 C# 开始,我使用以下代码开始工作。

exec msdb..sp_start_job @job_name='Upload_Job'

【问题讨论】:

  • 您不能将参数传递给 SQL 代理作业。而是让作业获取参数(甚至 DTS)。
  • 您能否详细说明一下。
  • SSIS 目录 API 将是触发和管理作业(包括提供“参数”)的更好方法。如果你使用jobs来启动你的包,你很难知道它们是否还在执行,是成功还是失败,也很难传入参数。
  • 此链接有使用 SSISDB 目录存储过程的示例,包括传入参数的示例。 zappysys.com/blog/…。您需要停止使用 sp_start_job 并改用此方法。

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


【解决方案1】:

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

如果需要向作业传递参数,SQL Agent 不支持。

如果您要传递一组有限的参数:Update Hr、Load Finance、Delta Processing、Full Load - 然后为每个场景创建一个作业并完成它。

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

【讨论】:

    【解决方案2】:

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

    @Nick.McDermaid 表示存在对“并行性”的担忧。如果有可能将此作业设置为快速连续运行,您可能会有一个“参数队列”。 SSIS 包的第一步是从队列中“弹出”顶部参数。这样一来,它就可以毫无问题地快速运行。

    【讨论】:

    • 感谢 DB101。我以前看过这个建议,但找不到任何例子。如果可能的话,你能分享一个例子吗?
    • 这种方法存在并行问题。即如果有两个不同参数的job同时调用,在包实际启动时,你不知道参数表中每个包看到了哪些参数。
    【解决方案3】:

    就像一些在 cmets 中所说的那样,更好的答案是不使用代理,而是在 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;
    

    任何问题,请尽管提问。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 2012-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多