2008-09-25 22 views
41

¿Hay alguna manera similar en SQL para lograr lo siguiente, pero con trabajos de servidor de SQL en su lugar?SQL Server Agent Job - ¿Existe entonces Drop?

así es como lo hago para los procedimientos almacenados ..

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

Respuesta

73

Pruebe algo como esto:

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' 

Lo mejor para leer los documentos en todos los parámetros requeridos para 'sp_add_job' y 'sp_delete_job'

+0

EXEC msdb.dbo.sp_delete_job @job_id debe ser: EXEC msdb.dbo.sp_delete_job @jobId – madcolor

+0

Cuando SQL Server Management Studio genera SQL para comprobar si existe o no el trabajo, usa la vista 'msdb.dbo.sysjobs_view'. No tengo idea por qué, solo una observación. – Tom

-2

Se puede crear una tarea de ejecución de secuencias de comandos y ejecutarlo como un trabajo ...

2

Si genera la secuencia de comandos SQL para un trabajo (probado con el administrador de la empresa), crea automáticamente la comprobación de las declaraciones de presencia y exclusión. Ejemplo a continuación: -

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 
13
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 
Cuestiones relacionadas