【问题标题】:Parameterize sp_add_jobstep for SSIS为 SSIS 参数化 sp_add_jobstep
【发布时间】:2018-01-14 19:25:33
【问题描述】:

从一个 TSQL 存储过程中,我想使用 msdb 数据库中的 sp_add_jobstep 存储过程来创建一个调用 SSIS 包的 SQL 代理作业。我需要以编程方式执行此操作,以便在创建作业时动态设置 SSIS 包中的参数之一。在“SQL Server Agent>Jobs>New Job”GUI 中,这是在“Steps>Edit>Configuration>Parameters”屏幕下完成的。如何使用 sp_add_jobstep 存储过程分配参数?

微软文档:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-jobstep-transact-sql 不解释这一点。

相关帖子:

这篇文章展示了如何在 T-SQL 或 C# 中创建代理作业:Create SQL Server Agent jobs programatically

而且这篇文章展示了 SSIS 语法,但没有讨论参数:How do I create a step in my SQL Server Agent Job which will run my SSIS package?

【问题讨论】:

    标签: sql-server tsql stored-procedures ssis


    【解决方案1】:

    正如 SAS 的响应中所述,参数必须作为命令的一部分传递。 sp_add_jobstep 的文档显示了一个名为 @additional_parameters 的参数,但请注意不支持此参数。因此,虽然我没有编写脚本(这样会更快),但我确实做了一个示例作业,然后查询 msdb.dbo.sysjobsteps 表以查看命令的格式。基于此,以及 CSharper 之前的帖子,我编写了以下存储过程:

    CREATE PROCEDURE [dbo].[CreateAgentjobHourlySSIS]
        @job NVARCHAR(128),
        @package NVARCHAR(max), -- \SSISDB\MyCatalog\MyProject\MyPackage.dtsx
        @params NVARCHAR(max), -- /Par "\"$Project::MyParameter\"";ParameterValue /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";1 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True
        @servername NVARCHAR(28),
        @startdate DATE,
        @starttime TIME,
        @frequencyhours INT
    AS
    BEGIN TRY
        BEGIN TRAN
    
        --GRANT EXEC on CreateAgentjobHourlySSIS to PUBLIC
        --1. Add a job
        EXEC msdb.dbo.sp_add_job
            @job_name = @job
    
        --2. Add a job step named process step. This step runs the stored procedure
        DECLARE @SSIScommand as NVARCHAR(max)
        SET @SSIScommand = '/ISSERVER "\"'+@package+'\"" /SERVER "\"'+@servername+'\"" '+@params+' /CALLERINFO SQLAGENT /REPORTING E'
    
        EXEC msdb.dbo.sp_add_jobstep
            @job_name = @job,
            @step_name = N'process step',
            @subsystem = N'Dts',
            @command = @SSIScommand
    
        --3. Schedule the job starting at a specified date and time
        DECLARE @startdateasint int = YEAR(@startDate)*10000+MONTH(@startdate)*100+DAY(@startdate)
        DECLARE @starttimeasint int = DATEPART(HOUR,@starttime)*10000+DATEPART(MINUTE,@starttime)*100+DATEPART(SECOND,@starttime)
    
        EXEC msdb.dbo.sp_add_jobschedule @job_name = @job,
            @name = 'Hourly Schedule',
            @freq_type = 4, --daily
            @freq_interval = 1,
            @freq_subday_type = 0x8, -- hourly
            @freq_subday_interval = @frequencyhours,
            @active_start_date = @startdateasint,
            @active_start_time = @starttimeasint
    
        --4. Add the job to the SQL Server 
        EXEC msdb.dbo.sp_add_jobserver
            @job_name =  @job,
            @server_name = @servername
        COMMIT TRAN
    END TRY
    BEGIN CATCH
        SELECT ERROR_Message(), ERROR_Line();
        ROLLBACK TRAN
    END CATCH
    

    【讨论】:

      【解决方案2】:

      你像这样构造调用:

      @command=N'/ISSERVER " 
      ...
      /Par "\"$Project::MyParam\"";ParamValue
      ...
      

      如果您已经有类似的工作,您可以右键单击 SSMS 并编写脚本。 这将向您展示语法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-15
        • 2017-01-27
        相关资源
        最近更新 更多