【问题标题】:SQL Server Agent Job - Exists then Drop?SQL Server 代理作业 - 存在然后丢弃?
【发布时间】:2010-09-13 07:12:20
【问题描述】:

如果(且仅当)存在 sql server 代理作业,我如何删除它?

这是一个用于存储过程的功能良好的脚本。我怎样才能对 sql server 代理作业做同样的事情?

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[storedproc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[storedproc]
GO
CREATE PROCEDURE [dbo].[storedproc] ...

【问题讨论】:

    标签: sql sql-server sql-server-agent sql-job


    【解决方案1】:

    试试这样的:

    DECLARE @jobId binary(16)
    
    SELECT @jobId = job_id FROM msdb.dbo.sysjobs WHERE (name = N'Name of Your Job')
    IF (@jobId IS NOT NULL)
    BEGIN
        EXEC msdb.dbo.sp_delete_job @jobId
    END
    
    DECLARE @ReturnCode int
    EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'Name of Your Job'
    

    最好阅读有关'sp_add_job''sp_delete_job' 所需参数的文档

    【讨论】:

    • EXEC msdb.dbo.sp_delete_job @job_id 应该是:EXEC msdb.dbo.sp_delete_job @jobId
    • SQL Server管理工作室生成SQL检查作业是否存在时,使用视图'msdb.dbo.sysjobs_view'。不知道为什么,只是观察。
    • ` EXEC msdb.dbo.sp_delete_job @job_name = @JobName 会更容易一些,因为您不必从 jobname 转到 jobid :shrug: `
    【解决方案2】:
    IF EXISTS (SELECT job_id 
                FROM msdb.dbo.sysjobs_view 
                WHERE name = N'Your Job Name')
    EXEC msdb.dbo.sp_delete_job @job_name=N'Your Job Name'
                                , @delete_unused_schedule=1
    

    【讨论】:

      【解决方案3】:

      如果您为作业生成 SQL 脚本(使用企业管理器测试),它会自动为您构建存在性检查和删除语句。下面的例子:-

      DECLARE @JobID BINARY(16)   
      DECLARE @ReturnCode INT  
      SELECT @ReturnCode = 0  
      -- Delete the job with the same name (if it exists)  
      SELECT @JobID = job_id   
      FROM  msdb.dbo.sysjobs  
      WHERE (name = N'My test job')   
      IF (@JobID IS NOT NULL)  
      BEGIN  
      -- Check if the job is a multi-server job  
      IF (EXISTS (SELECT *   
      FROM msdb.dbo.sysjobservers   
      WHERE (job_id = @JobID) AND (server_id <> 0)))   
      BEGIN   
      -- There is, so abort the script   
      RAISERROR (N'Unable to import job ''My test job'' since there is already a multi-server   job with this name.', 16, 1) 
      END   
      ELSE   
      -- Delete the [local] job   
      EXECUTE msdb.dbo.sp_delete_job @job_name = N'My test job'   
      SELECT @JobID = NULL  
      END 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-07
        • 2017-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多