2017-08-31 63 views
0

我想創建一個選擇語句,它將使用jobname創建作業並創建作業語句。從select語句中,我應該能夠選擇create語句,通過複製並粘貼到另一臺服務器上,可以稍後將其用於作業創建。如果有多個步驟可用多個步驟在SQL Server中的JOB腳本

我已經嘗試過使用以下腳本。

select @@SERVERNAME,sj.name, ' 
USE [msdb] 
GO 

BEGIN TRANSACTION 
DECLARE @ReturnCode INT 
SELECT @ReturnCode = 0 
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=''[Uncategorized (Local)]'' AND category_class=1) 
BEGIN 
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=JOB, @type=LOCAL, @name=''[Uncategorized (Local)]'' 
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

END 

DECLARE @jobId BINARY(16) 
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'''+sj.name+''', 
    @enabled='+convert(varchar(20),sj.enabled)+', 
    @notify_level_eventlog='+convert(varchar(20),sj.notify_level_eventlog)+', 
    @notify_level_email='+convert(varchar(20),sj.notify_level_email)+', 
    @notify_level_netsend='+convert(varchar(20),sj.notify_level_netsend)+', 
    @notify_level_page='+convert(varchar(50),sj.notify_level_page)+', 
    @delete_level='+convert(varchar(50),sj.delete_level)+', 
    @description=N'''+convert(varchar(50),sj.description)+''', 
    @category_name=''[Uncategorized (Local)]'', 
    @owner_login_name='''', @job_id = @jobId OUTPUT 
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 


EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'''+convert(varchar(50),sjs.step_name)+''', 
    @step_id='+convert(varchar(50),sjs.step_id)+', 
    @cmdexec_success_code='+convert(varchar(50),sjs.cmdexec_success_code)+', 
    @on_success_action='+convert(varchar(50),sjs.on_success_action)+', 
    @on_success_step_id='+convert(varchar(50),sjs.on_success_step_id)+', 
    @on_fail_action='+convert(varchar(50),sjs.on_fail_action)+', 
    @on_fail_step_id='+convert(varchar(50),sjs.on_fail_step_id)+', 
    @retry_attempts='+convert(varchar(50),sjs.retry_attempts)+', 
    @retry_interval='+convert(varchar(50),sjs.retry_interval)+', 
    @os_run_priority='+convert(varchar(50),sjs.os_run_priority)+', @subsystem=N'''+convert(varchar(50),sjs.subsystem)+''', 
    @command=N'''+convert(varchar(50),sjs.command)+''', 
    @database_name=N'''+'master'+''', 
    @flags='+convert(varchar(50),sjs.flags)+' 
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'''[email protected]@SERVERNAME+''' 
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
COMMIT TRANSACTION 
GOTO EndSave 
QuitWithRollback: 
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 
EndSave: 
GO' 
from msdb.dbo.sysjobs sj inner join msdb.dbo.sysjobsteps sjs 
ON sj.job_id=sjs.job_id 
where subsystem='TSQL' 

而且我成功地能夠創造一份工作。

現在我需要腳本,可以生成步驟以及多個步驟也包含在上面生成的腳本中。

回答

0

我找到了符合我的要求的腳本,它可以在同一個表中的步驟中檢索select語句中的所有作業。

select @@SERVERNAME as PCNAME,sj.job_id,sjs.step_name,sjs.step_id,sj.name, 
' 
USE [msdb] 
GO 

BEGIN TRANSACTION 
    DECLARE @ReturnCode INT 
    SELECT @ReturnCode = 0 
    IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=''[Uncategorized (Local)]'' AND category_class=1) 
    BEGIN 
    EXEC @ReturnCode = msdb.dbo.sp_add_category @class=JOB, @type=LOCAL, @name=''[Uncategorized (Local)]'' 
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
    END 

    DECLARE @jobId BINARY(16) 
    EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'''+sj.name+''',@enabled='+convert(varchar(20),sj.enabled)+',@notify_level_eventlog='+convert(varchar(20),sj.notify_level_eventlog)+',@notify_level_email='+convert(varchar(20),sj.notify_level_email)+',@notify_level_netsend='+convert(varchar(20),sj.notify_level_netsend)+',@notify_level_page='+convert(varchar(50),sj.notify_level_page)+',@delete_level='+convert(varchar(50),sj.delete_level)+', @description=N'''+convert(varchar(50),sj.description)+''',@category_name=''[Uncategorized (Local)]'', @owner_login_name='''', @job_id = @jobId OUTPUT 

    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

    EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @[email protected], @step_name=N'''+convert(varchar(50),sjs.step_name)+''',@step_id='+convert(varchar(50),sjs.step_id)+',@cmdexec_success_code='+convert(varchar(50),sjs.cmdexec_success_code)+',@on_success_action='+convert(varchar(50),sjs.on_success_action)+',@on_success_step_id='+convert(varchar(50),sjs.on_success_step_id)+',@on_fail_action='+convert(varchar(50),sjs.on_fail_action)+',@on_fail_step_id='+convert(varchar(50),sjs.on_fail_step_id)+',@retry_attempts='+convert(varchar(50),sjs.retry_attempts)+',@retry_interval='+convert(varchar(50),sjs.retry_interval)+',@os_run_priority='+convert(varchar(50),sjs.os_run_priority)+',subsystem=N'''+convert(varchar(50),sjs.subsystem)+''',@command=N'''+convert(varchar(50),sjs.command)+''',@database_name=N'''+'master'+''',@flags='+convert(varchar(50),sjs.flags)+' 

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name 
= N'''[email protected]@SERVERNAME+''' 
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
COMMIT TRANSACTION 
GOTO EndSave 
QuitWithRollback: 
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 
EndSave: 
GO' as script into #temp1 
from msdb.dbo.sysjobs sj inner join msdb.dbo.sysjobsteps sjs 
ON sj.job_id=sjs.job_id 
where subsystem='TSQL'​ 
and sjs.step_id=1 


declare @jobstep as int,@command as varchar(max), @stepid int=2 
declare concatenation cursor for 
select job_id,step_name,step_id, 
'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @[email protected], 
@step_name=N'''+step_name+''', 
@step_id='+convert(varchar(20),step_id)+', 
@cmdexec_success_code='+convert(varchar(20),cmdexec_success_code)+', 
@on_success_action='+convert(varchar(20),on_success_action)+', 
@on_success_step_id='+convert(varchar(20),on_success_step_id)+', 
@on_fail_action='+convert(varchar(20),on_fail_action)+', 
@on_fail_step_id='+convert(varchar(20),on_fail_step_id)+', 
@retry_attempts='+convert(varchar(20),retry_attempts)+', 
@retry_interval='+convert(varchar(20),retry_interval)+', 
@os_run_priority='+convert(varchar(20),os_run_priority)+', 
@subsystem=N'''+subsystem+''', 
@command=N'''+command+''''', 
@server=N'''[email protected]@SERVERNAME+''''', 
@database_name=N'''+database_name+''', 
@flags='+convert(varchar(20),flags)+', 
@proxy_name=N'''+case when proxy_id is null then CURRENT_USER end+'''' as 
command from msdb.dbo.sysjobsteps 
where step_id<>1 
open concatenation; 

fetch next from concatenation 
while @@FETCH_STATUS=0 
begin 
update t 
set t.script=CONCAT(t.script,' ----------- ',command) 
from #temp1 t inner join msdb.dbo.sysjobsteps sjs 
ON t.job_id=sjs.job_id 
where t.job_id=sjs.job_id 
and sjs.step_id<>1 
and [email protected] 

set @[email protected]+1 
fetch next from concatenation 


end 
close concatenation 
deallocate concatenation 



select * from #temp1 
DROP TABLE #temp1