Задание агента SQL Server — существует, а затем удаляется?

Как я могу удалить задания агента сервера sql, если (и только если) он существует?

Это хорошо работающий скрипт для хранимых процедур. Как я могу сделать то же самое для заданий агента сервера sql?

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] ...

person madcolor    schedule 25.09.2008    source источник


Ответы (2)


Попробуйте что-то вроде этого:

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'

person Codewerks    schedule 26.09.2008
comment
EXEC msdb.dbo.sp_delete_job @job_id должен быть: EXEC msdb.dbo.sp_delete_job @jobId - person madcolor; 06.10.2008
comment
Когда студия управления SQL Server генерирует SQL для проверки существования задания, она использует представление «msdb.dbo.sysjobs_view». Не знаю почему, просто наблюдение. - person Tom; 27.04.2011
comment
` EXEC msdb.dbo.sp_delete_job @job_name = @JobName немного проще, так как вам не нужно переходить от имени задания к идентификатору задания :shrug: ` - person visch; 21.07.2021

Если вы сгенерируете сценарий SQL для задания (протестировано с помощью Enterprise Manager), он автоматически создаст для вас проверку существования и операторы удаления. Пример ниже: -

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 
person Andy Jones    schedule 26.09.2008