2017-08-07 21 views
0

從TSQL存儲過程中,我想使用msdb數據庫中的sp_add_jobstep存儲過程來創建調用SSIS包的SQL代理作業。我需要以編程方式執行此操作,以在作業創建時動態設置SSIS包中的一個參數。在「SQL Server代理>作業>新建作業」GUI中,在「步驟>編輯>配置>參數」屏幕下完成。如何使用sp_add_jobstep存儲過程分配參數?SSIS的參數化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?

回答

0

您構建這樣的電話:

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

如果alrea dy有類似的工作,你可以右鍵單擊SSMS並將其編寫出來。 這會顯示你的語法。

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 "\"'[email protected]+'\"" /SERVER "\"'[email protected]+'\"" '[email protected]+' /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 
+0

不錯,謝謝。 – SAS