微软BI开拓者数据库专区SQL Server管理 自动生成Job脚本(公测)

1  /  1  页   1 跳转 查看:1943

自动生成Job脚本(公测)

自动生成Job脚本(公测)

发一段自动生成JOB代码的脚本,望各位兄弟一起帮忙测试一下。(环境Sql 2005)

/*
举例:
  EXEC #usp_AutoGetJobScript @Route='x:\JobTest\',@FileName='JobTest20090909.sql'
*/

CREATE PROC #usp_AutoGetJobScript
  @JobName VARCHAR(256)=''              --支持单个Job的脚本获取,默认为全选
,@Enable INT=2                          --0表示禁用的Job; 1表示启用的Job; 2为默认,表示全选
,@Route  VARCHAR(500)                  --输入文件路径 / 例如:e:\sqldata\ /
,@FileName VARCHAR(200)='Job.sql'      --输入文件名称
AS

DECLARE  @JobList TABLE(
        ID INT IDENTITY(1,1) PRIMARY KEY
      ,JobName VARCHAR(256)
        )
DECLARE @JobScript VARCHAR(MAX)
SELECT @JobScript=''
CREATE TABLE ##JobScript(SqlCmd VARCHAR(MAX))

--条件过滤
IF (@JobName='')
BEGIN
  IF (@Enable NOT IN (0,1))
  BEGIN
    INSERT INTO @JobList
    SELECT [name] FROM  Msdb.dbo.sysjobs (NOLOCK)
    ORDER BY [name] ASC
  END
  ELSE
  BEGIN
    INSERT INTO @JobList
    SELECT [name] FROM  Msdb.dbo.sysjobs (NOLOCK)
    WHERE [Enabled]=@Enable
    ORDER BY [name] ASC
  END

END
ELSE
BEGIN
  IF (@Enable NOT IN (0,1))
  BEGIN
    INSERT INTO @JobList
    SELECT [name] FROM  Msdb.dbo.sysjobs (NOLOCK)
    WHERE [Name]=@JobName
    ORDER BY [name] ASC
  END
  ELSE
  BEGIN
    INSERT INTO @JobList
    SELECT [name] FROM  Msdb.dbo.sysjobs (NOLOCK)
    WHERE [Enabled]=@Enable
    AND  [Name]=@JobName
--    ORDER BY [name] ASC
  END
END

DECLARE  @ID INT
  ,@MaxID INT
SELECT @ID=1
SELECT @MaxID=MAX(ID)FROM @JobList

WHILE (@ID<=@MaxID)
BEGIN
  DECLARE  @SqlCmd VARCHAR(MAX)
    ,@SqlJob VARCHAR(MAX)
    ,@SqlJobstep VARCHAR(MAX)
    ,@SqlJobstartstep VARCHAR(MAX)
    ,@Sqljobschedule VARCHAR(MAX)
    ,@Sqljobserver VARCHAR(MAX)
    ,@Job_id UNIQUEIDENTIFIER
    ,@start_step_id INT
    ,@categoryName VARCHAR(128)
    ,@category_class INT
    ,@ScriptTime VARCHAR(32)

  SELECT  @JobName=JobName FROM @JobList WHERE ID=@ID
  SELECT  @ScriptTime=CONVERT(VARCHAR(19),GETDATE(),101)+' '+CONVERT(VARCHAR(8),GETDATE(),114)

  SELECT  TOP 1 @categoryName=b.Name
      ,@category_class=b.category_class
      ,@Job_id=a.Job_id
      ,@start_step_id=start_step_id
  FROM Msdb.dbo.sysjobs (NOLOCK) a
  INNER JOIN Msdb.dbo.syscategories (NOLOCK) b ON  a.category_id=b.category_id
  WHERE a.name=@JobName

  --获取Job描述信息
  SELECT @SqlCmd=  CHAR(10)
      +'/****** Object:  Job ['+@JobName+']    Script Date: [email=]'+@ScriptTime+'[/email] ******/'+CHAR(10)
      +'BEGIN TRANSACTION'+CHAR(10)+'DECLARE @ReturnCode INT'+CHAR(10)+'SELECT @ReturnCode = 0'+CHAR(10)
      +'/****** Object:  JobCategory ['+@categoryName+']    Script Date: [email=]'+@ScriptTime+'[/email] ******/'+CHAR(10)
      +'IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'''+@categoryName+''' AND category_class='+CAST(@category_class AS VARCHAR)+')'+CHAR(10)
      +'BEGIN'+CHAR(10)
      +'EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N''JOB'', @type=N''LOCAL'', @name=N'''+@categoryName+''''+CHAR(10)
      +'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'+CHAR(10)+CHAR(10)
      +'END'+CHAR(10)+CHAR(10)

  --获取Job基本信息
  SELECT @SqlJob=  'DECLARE @jobId BINARY(16)'+CHAR(10)
      +'EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'''+@JobName+''','+CHAR(10)
      +'  @enabled='+CAST([enabled] AS VARCHAR)+','+CHAR(10)
      +'  @notify_level_eventlog='+CAST(notify_level_eventlog AS VARCHAR)+','+CHAR(10)
      +'  @notify_level_email='+CAST(notify_level_email AS VARCHAR)+','+CHAR(10)
      +'  @notify_level_netsend='+CAST(notify_level_netsend AS VARCHAR)+','+CHAR(10)
      +'  @notify_level_page='+CAST(notify_level_page AS VARCHAR)+','+CHAR(10)
      +'  @delete_level='+CAST(delete_level AS VARCHAR)+','+CHAR(10)
      +'  @description=N'''+ISNULL([description],'')+''','+CHAR(10)
      +'  @category_name=N'''+@categoryName+''','+CHAR(10)
      +'  @owner_login_name=N'''+ISNULL(b.name,'sa')+''', @job_id = @jobId OUTPUT'+CHAR(10)
      +'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'
  FROM Msdb.dbo.sysjobs (NOLOCK) a
  LEFT JOIN SYS.SYSLOGINS (NOLOCK) b ON a.owner_sid=b.sid
  WHERE a.name=@JobName

  --获取Job的步骤
  SELECT @SqlJobstep=''

  DECLARE  @step_id INT
    ,@step_maxid INT
  SELECT  @step_id=MIN(b.step_id)
    ,@step_maxid=MAX(b.step_id)
  FROM Msdb.dbo.sysjobs (NOLOCK) a
  INNER JOIN Msdb.dbo.sysjobsteps (NOLOCK) b ON a.job_id=b.job_id
  WHERE a.name=@JobName

  WHILE (@step_id<=@step_maxid)
  BEGIN
    SELECT @SqlJobstep= @SqlJobstep+CHAR(10)
          +'/****** Object:  Step ['+step_name+']    Script Date: [email=]'+@ScriptTime+'[/email] ******/'+CHAR(10)
          +'EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'''+step_name+''','+CHAR(10)
          +'  @step_id='+CAST(step_id AS VARCHAR)+','+CHAR(10)
          +'  @cmdexec_success_code='+CAST(cmdexec_success_code AS VARCHAR)+','+CHAR(10)
          +'  @on_success_action='+CAST(on_success_action AS VARCHAR)+','+CHAR(10)
          +'  @on_success_step_id='+CAST(on_success_step_id AS VARCHAR)+','+CHAR(10)
          +'  @on_fail_action='+CAST(on_fail_action AS VARCHAR)+','+CHAR(10)
          +'  @on_fail_step_id='+CAST(on_fail_step_id AS VARCHAR)+','+CHAR(10)
          +'  @retry_attempts='+CAST(retry_attempts AS VARCHAR)+','+CHAR(10)
          +'  @retry_interval='+CAST(retry_interval AS VARCHAR)+','+CHAR(10)
          +'  @os_run_priority='+CAST(os_run_priority AS VARCHAR)+','
          +'  @subsystem=N'''+subsystem+''','+CHAR(10)
          +'  @command=N'''+ISNULL(REPLACE(command,'''',''''''),'')+''','+CHAR(10)   
          +ISNULL('  @server=N'''+REPLACE([server],'''','''''')+''','+CHAR(10),'')         
          +ISNULL('  @database_name=N'''+database_name+''','+CHAR(10),'')
          +'  @flags='+CAST(flags AS VARCHAR)+CHAR(10)
          +'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'
    FROM  Msdb.dbo.sysjobsteps (NOLOCK)
    WHERE Job_id=@Job_id
      AND step_id=@step_id

    SELECT @step_id=MIN(step_id)FROM Msdb.dbo.sysjobsteps (NOLOCK)WHERE Job_id=@Job_id AND step_id>@step_id
  END

  --获取Job开始步骤
  SELECT @SqlJobstartstep=CHAR(10)+'EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id ='+CAST(@start_step_id AS VARCHAR)
        +CHAR(10)+'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'+CHAR(10)

  --获取Job的调度
  SELECT @Sqljobschedule=''
  SELECT @Sqljobschedule= @Sqljobschedule+CHAR(10)
          +'EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'''+b.name+''','+CHAR(10)
          +'  @enabled='+CAST(b.enabled AS VARCHAR)+','+CHAR(10)
          +'  @freq_type='+CAST(b.freq_type AS VARCHAR)+','+CHAR(10)
          +'  @freq_interval='+CAST(b.freq_interval AS VARCHAR)+','+CHAR(10)
          +'  @freq_subday_type='+CAST(b.freq_subday_type AS VARCHAR)+','+CHAR(10)
          +'  @freq_subday_interval='+CAST(b.freq_subday_interval AS VARCHAR)+','+CHAR(10)
          +'  @freq_relative_interval='+CAST(b.freq_relative_interval AS VARCHAR)+','+CHAR(10)
          +'  @freq_recurrence_factor='+CAST(b.freq_recurrence_factor AS VARCHAR)+','+CHAR(10)
          +'  @active_start_date='+CAST(b.active_start_date AS VARCHAR)+','+CHAR(10)
          +'  @active_end_date='+CAST(b.active_end_date AS VARCHAR)+','+CHAR(10)
          +'  @active_start_time='+CAST(b.active_start_time AS VARCHAR)+','+CHAR(10)
          +'  @active_end_time='+CAST(b.active_end_time AS VARCHAR)+CHAR(10)
          +'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'
  FROM  Msdb.dbo.sysjobs (NOLOCK) a
  INNER JOIN Msdb.dbo.sysjobschedules (NOLOCK) c ON a.job_id=c.job_id
  INNER JOIN Msdb.dbo.sysschedules (NOLOCK) b ON c.schedule_id=b.schedule_id
  WHERE a.name=@JobName
  ORDER BY b.schedule_id ASC

  --获取Jobserver
  SELECT @Sqljobserver= CHAR(10)+'EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'''
        +CASE WHEN a.originating_server_id=0 THEN '(local)' ELSE b.name END+''''+CHAR(10)
        +'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'+CHAR(10)
        +'COMMIT TRANSACTION'+CHAR(10)
        +'GOTO EndSave'+CHAR(10)
        +'QuitWithRollback:'+CHAR(10)
        +'    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION'+CHAR(10)
        +'EndSave:'
  FROM Msdb.dbo.sysjobs (NOLOCK) a
  INNER JOIN sys.servers (NOLOCK) b ON a.originating_server_id=b.server_id
  SELECT @JobScript=  @JobScript
      +CHAR(10)
      +ISNULL(@SqlCmd,'')
      +ISNULL(@SqlJob,'')
      +ISNULL(@SqlJobstep,'')
      +ISNULL(@SqlJobstartstep,'')
      +ISNULL(@Sqljobschedule,'')
      +ISNULL(@Sqljobserver ,'')
      +CHAR(10)+'GO'
  SELECT @ID=@ID+1
END

SELECT @JobScript='USE [msdb]'+CHAR(10)+'GO'+@JobScript

INSERT INTO ##JobScript
SELECT @JobScript

--导出到文件
DECLARE @SqlText VARCHAR(MAX)
SELECT @SqlText='Master.dbo.XP_CMDSHELL ''BCP ##JobScript OUT [email=]'+@Route+@FileName+'[/email] -T -c -S'+@@SERVERNAME+''''
EXEC (@SqlText)

DROP TABLE ##JobScript
 

回复:自动生成Job脚本(公测)

还没用上SQL2005。帮顶!!!!
 
1  /  1  页   1 跳转

版权所有 微软BI开拓者 

Powered by Discuz!NT 2.1.202    Copyright © 2001-2012 Comsenz Inc.
Processed in 0.0468768 second(s) , 3 queries.
返顶部