为SSIS参数化sp_add_jobstep

时间:2017-08-07 13:10:28

标签: sql-server tsql stored-procedures ssis

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

Microsoft文档: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?

2 个答案:

答案 0 :(得分:1)

如SAS的回应中所述,params必须作为命令的一部分传递。 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

答案 1 :(得分:0)

你构建这样的调用:

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

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