mssql job脚本生成方法

SQLServer Mirror能同步用户数据库,但是不能同步model数据库,导致用户job无法同步到mirror,需要开发脚本去同步Job。

通过工具生成Job脚本方法见 http://www.cnblogs.com/dudu/archive/2013/02/27/sql-server-export-job.html

使用powershell 可以将工具这段操作用代码实现。

注:代码来自网上。

View Code
# Date:     23/02/12
# Author:   John Sansom
# Description:  PS script to generate all SQL Server Agent jobs on the given instance.
#  The script accepts an input file of server names.
# Version:  1.0
# modifer :xuancan 2012-08-20
# Example Execution: .Create_SQLAentJobSripts.ps1 .ServerNameList.txt 
param($ServerName) 

#Load the SQL Server SMO Assemly

[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SqlServer.Smo”) | Out-Null 

#Create a new SqlConnection object

$objSQLConnection = New-Object System.Data.SqlClient.SqlConnection 
#For each server in the array do the following..
    Try  {       
        $objSQLConnection.ConnectionString = “Server=$ServerName;Integrated Security=SSPI;”           
        write-output “Trying to connect to SQL Server instance on $ServerName…” -NoNewline           
        $objSQLConnection.Open() | Out-Null            
    write-output “Success.”       
    $objSQLConnection.Close()  
     }   
    Catch {        
        write-output -BackgroundColor Red -ForegroundColor White “Fail”      
    $errText =  $Error[0].ToString()          
        if ($errText.Contains(“network-related”))    
        {write-output “Connection Error. Check server name, port, firewall.”}      
    write-output $errText  
    exit     
         }  

##############each job to a sepearate file########
    #Create a new SMO instance for this $ServerName   
    $srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" $ServerName  
    #Script out each SQL Server Agent Job for the server    
    $jobs = $srv.JobServer.Jobs
    #Using regex invocation courtesy of Jan Goyvaerts at regular-expressions.info  
    #$regex = [regex] '[ ^a-zA-Z- ]'   
    foreach ($job in $jobs)    
    {    
    write-output "####@!####"
    write-output "$Job" 
    write-output "----@!----"
    write-output $job.Script()    
    }

另外也可以通过存储过程去拼接Job创建语句。

注:代码来自网上

View Code
CREATE PROC DumpJob ( @job VARCHAR( 100))
AS
DECLARE @retrun NVARCHAR (max)
DECLARE @jobname VARCHAR (30), @category_calss_i INT ,@category_calss VARCHAR(50 ),@category_name VARCHAR (50)
,@category_type VARCHAR (30), @category_id int
,@category_type_i int
SELECT @jobname = 'powershell', @category_calss = '',@category_name ='', @category_type = ''
SELECT @jobname = @job
SELECT @category_calss = CASE WHEN tshc. category_class = 1 THEN 'JOB'
    WHEN tshc. category_class = 2 THEN 'ALERT'
    else 'OPERATOR'
END  
, @category_type = CASE WHEN tshc. category_type = 1 THEN 'LOCAL'
    WHEN tshc. category_type = 2 THEN 'MULTI-SERVER'
    else 'NONE'
END 
,@category_name = tshc.name
,@category_type_i = category_type
,@category_calss_i = tshc.category_class
,@category_id = tshc.category_id
FROM
msdb.dbo .sysjobs_view AS sv
INNER JOIN msdb.dbo .syscategories  AS tshc ON sv .category_id = tshc.category_id
WHERE
(sv. name=@jobname AND tshc. category_class = 1 )

SET @retrun =   ' BEGIN TRANSACTION'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'DECLARE @ReturnCode INT'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N''' + @category_name + '''AND category_class=' +rtrim (@category_calss_i)+ ')'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'BEGIN'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'''+ @category_calss+''', @type=N'''+@category_type+ ''', @name=N'''+@category_name +''''
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'end'

DECLARE @EventLogLevel INT ,@EmailLevel INT ,@NetSendLevel INT ,@PageLevel INT
DECLARE  @EmailLeveloprid NVARCHAR (256), @NetSendLeveloprid NVARCHAR(256 ),@PageLeveloprid NVARCHAR (256)
DECLARE @isenable INT , @description NVARCHAR(1024 ),@owner_log_name Nvarchar(512 ),@delete_level INT
DECLARE @jobId UNIQUEIDENTIFIER ,@start_step_id INT ,@server NVARCHAR (512)
SELECT
@EventLogLevel=sv .notify_level_eventlog
,@EmailLevel= sv.notify_level_email 
,@NetSendLevel= sv.notify_level_netsend 
,@PageLevel= sv.notify_level_page 
,@EmailLeveloprid = ISNULL(( SELECT TOP 1 name FROM   msdb ..sysoperators WHERE id = sv.notify_email_operator_id ),'')
,@NetSendLeveloprid  =   ISNULL(( SELECT TOP 1 name FROM   msdb..sysoperators WHERE id = sv .notify_netsend_operator_id), '')
,@PageLeveloprid = ISNULL(( SELECT TOP 1 name FROM   msdb ..sysoperators WHERE id = sv.notify_page_operator_id ),'')
,@isenable = sv.enabled
,@description = sv.description
,@owner_log_name = ISNULL( suser_sname(sv .owner_sid), N'''')  
,@delete_level = sv.delete_level
,@jobId = sv.job_id
,@start_step_id = start_step_id
,@server = originating_server
FROM msdb. dbo.sysjobs_view AS sv
WHERE (sv .name= @jobname and sv .category_id= 0)


SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'DECLARE @jobId BINARY(16)'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'''+ @jobname+''','
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @enabled='+RTRIM( @isenable)+', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @notify_level_eventlog='+ RTRIM(@EventLogLevel )+', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @notify_level_email='+RTRIM( @EmailLevel)+', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @notify_level_netsend='+ RTRIM(@NetSendLevel )+', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @notify_level_page='+RTRIM( @PageLevel)+', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @notify_email_operator_name ='''+RTRIM( @EmailLeveloprid)+''', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @notify_netsend_operator_name='''+ RTRIM(@NetSendLeveloprid )+''', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @notify_page_operator_name='''+ RTRIM(@PageLeveloprid )+''', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @delete_level='+RTRIM( @delete_level)+', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @description=N'''+@description+ ''', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @category_name=N'''+@category_name+ ''', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @owner_login_name=N'''+ @owner_log_name+''', '
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @job_id = @jobId OUTPUT'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'
    --SELECT * FROM msdb.dbo.syscategories

DECLARE @step_id INT
declare @step_name nvarchar (512) ,@cmdexec_success_code INT,@on_success_action INT,@on_success_step_id INT
        ,@on_fail_action INT ,@on_fail_step_id INT ,@retry_attempts INT,@retry_interval INT,@os_run_priority INT
        ,@subsystem NVARCHAR (512), @database_name NVARCHAR( 512),@flags INT,@command NVARCHAR(max )

DECLARE jbcur CURSOR   FOR  SELECT step_id  FROM msdb..sysjobsteps   WHERE job_id = @jobid ORDER BY step_id ;
OPEN jbcur;
FETCH NEXT FROM jbcur INTO @step_id
WHILE @@FETCH_STATUS = 0
BEGIN
   
    SELECT @step_name = step_name
            ,@cmdexec_success_code= cmdexec_success_code
            ,@on_success_action = on_success_action
            ,@on_success_step_id = on_success_step_id
            ,@on_fail_action = on_fail_action
            ,@on_fail_step_id = on_fail_step_id
            ,@retry_attempts = retry_attempts
            ,@retry_interval = retry_interval
            ,@os_run_priority = os_run_priority
            ,@subsystem = subsystem
            ,@database_name = database_name
            ,@command = command
            ,@flags = flags
    FROM  msdb.. sysjobsteps a WHERE job_id = @jobid and step_id  = @step_id
   
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @step_name=N'''+@step_name+ ''', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @step_id='+RTRIM( @step_id)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @cmdexec_success_code='+ RTRIM(@cmdexec_success_code )+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @on_success_action='+RTRIM( @on_success_action)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @on_success_step_id='+RTRIM( @on_success_step_id)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @on_fail_action='+RTRIM( @on_fail_action)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @on_fail_step_id='+RTRIM( @on_fail_step_id)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @retry_attempts='+RTRIM( @retry_attempts)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @retry_interval='+RTRIM( @retry_interval)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @os_run_priority='+RTRIM( @os_run_priority)+', @subsystem=N'''+@subsystem+ ''', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @database_name=N'''+@database_name+ ''','
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @flags='+ RTRIM(@flags )+' ,'
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' @command=N'''+REPLACE( @command,'''' ,'''''')+ ''''
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'

    FETCH NEXT FROM jbcur INTO @step_id

END

CLOSE jbcur
DEALLOCATE jbcur
   
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = '+rtrim( @start_step_id)
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback    '

DECLARE @enabled INT ,@freq_type INT ,@freq_interval INT ,@freq_subday_type INT,@freq_subday_interval INT
    ,@freq_relative_interval INT ,@freq_recurrence_factor INT,@active_start_date INT,@active_end_date INT
    ,@active_start_time INT ,@active_end_time INT ,@name VARCHAR (512)

SELECT
@name = a .name
,@enabled = enabled
,@freq_interval = freq_interval
,@freq_type = freq_type
,@freq_subday_type= freq_subday_type
,@freq_subday_interval= freq_subday_interval
,@freq_relative_interval= freq_relative_interval
,@freq_recurrence_factor= freq_recurrence_factor
,@active_start_date= active_start_date
,@active_end_date= active_end_date
,@active_start_time= active_start_time
,@active_end_time= active_end_time
 FROM msdb ..sysschedules a
    INNER JOIN msdb.dbo .sysjobschedules b ON a.schedule_id = b.schedule_id
WHERE  job_id = @jobId
 
IF(@name IS not null)
begin
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'''+ @name+''', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @enabled='+RTRIM( @enabled)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @freq_type='+RTRIM( @freq_type)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @freq_interval='+RTRIM( @freq_interval)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @freq_subday_type='+RTRIM( @freq_subday_type)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @freq_subday_interval='+ RTRIM(@freq_subday_interval )+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @freq_relative_interval='+ RTRIM(@freq_relative_interval )+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @freq_recurrence_factor='+ RTRIM(@freq_recurrence_factor )+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @active_start_date='+RTRIM( @active_start_date)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @active_end_date='+RTRIM( @active_end_date)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @active_start_time='+RTRIM( @active_start_time)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @active_end_time='+RTRIM( @active_end_time)+', '
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    @schedule_uid=N'''+RTRIM( NEWID())+''''
    SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'
END
 

SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N''(local)'''
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'COMMIT TRANSACTION'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'GOTO EndSave'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'QuitWithRollback:'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + '    IF(@@TRANCOUNT>0)ROLLBACK TRANSACTION'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + 'EndSave:'
SET @retrun = @retrun+CHAR (13)+ CHAR(10 ) + ' '

select @retrun

 

 

posted @ 2013-04-17 14:39  mq4096  阅读(241)  评论(0)    收藏  举报