Obtener los tiempos de duración de un Job en secuancia horaria


Esta consulta, sirve para mostrar en forma de columnas, hora a hora, el tiempo de ejecucion de un Job determinado.

DECLARE @JobName VARCHAR(255) = 'Agent Job Name'
 
;WITH JobHistory AS
(
  SELECT
     @@servername as ServerName,
     a.run_date
    ,a.run_time / 10000 AS [HOUR]
    ,(a.run_duration / 10000 * 60 * 60	-- Hours
     + a.run_duration % 10000 / 100 * 60	-- Minutes
     + a.run_duration % 100			-- Seconds
     ) / 60.0 AS [DurationMinutes]
  FROM
    msdb.dbo.sysjobhistory a WITH(NOLOCK)
    INNER JOIN msdb.dbo.sysjobs b WITH(NOLOCK)
    ON 
      a.[job_id] = b.[job_id]
      AND b.[name] = @JobName
      AND step_id = 0
      AND run_status = 1
)
SELECT *
FROM
  JobHistory	
  PIVOT
  ( SUM(DurationMinutes)
    FOR [HOUR] 
    IN  ([00],[01],[02],[03],[04],[05]
        ,[06],[07],[08],[09],[10],[11]
        ,[12],[13],[14],[15],[16],[17]
        ,[18],[19],[20],[21],[22],[23])
  ) AS p

Deshabilitar Contraint y Trigger de una base de datos para hacer insercion masiva de registros.


En ciertas oportunidades, nos encontramos frente a la inicializacion de una base de datos especifica, la cual, ya fue diseñada y tiene todas sus constraint y posibles triggers.
Para no tener que deshabilitar a mano cada una de las mismas para luego tener que ejecutar la insercion de datos y al final, volver a habilitar los mismos, es que cree este script, que siguiendo su correcta secuencia, nos ahorra bastante tiempo.

Como primer paso, creo un cursor que recorra la totalidad de los objetos de dicha base de datos, deshabilitando todos los contraint de cada tabla, al igual que los triggers, si es que los hay, dicho script es el siguiente:

DECLARE	@Contraint	VARCHAR(255)
DECLARE	@Esquema	VARCHAR(255)
DECLARE	@Tabla		VARCHAR(255)
DECLARE	@Str		VARCHAR(MAX)


DECLARE CONSTRINT_CURSOR CURSOR FOR  
SELECT	OBJECT_NAME(OBJECT_ID) AS NameofConstraint, SCHEMA_NAME(schema_id) AS SchemaName, OBJECT_NAME(parent_object_id) AS TableName
FROM	sys.objects
WHERE	type_desc LIKE '%CONSTRAINT'
OPEN CONSTRINT_CURSOR   
FETCH NEXT FROM CONSTRINT_CURSOR INTO	@Contraint, @Esquema, @Tabla
WHILE @@FETCH_STATUS = 0        
BEGIN        
	--- Deshabilito Trigger
	SET	@Str= ''
	SET	@Str = 'ALTER TABLE ' + @Esquema + '.' + @Tabla + 'DISABLE TRIGGER ALL'
	EXEC (@Str)
	
	--- Deshabilito Contraint
	SET	@Str= ''
	SET	@Str = 'ALTER TABLE ' + @Esquema + '.' + @Tabla + 'NOCHECK CONSTRAINT' +  @Contraint
	EXEC (@Str)

FETCH NEXT FROM CONSTRINT_CURSOR INTO	@Contraint, @Esquema, @Tabla
END
CLOSE CONSTRINT_CURSOR
DEALLOCATE CONSTRINT_CURSOR

Una vez que ejecutamos el mismo, tenemos la base de datos en condiciones para poder realizar los DELETE e INSERT necesarios a nuestras tablas parametricas.

DELETE FROM Tabla1
INSERT INTO Tabla 1 (Campo1, Campo2) SELECT 1, 'How are you?' 

Cuando tengamos todos los datos como queremos que esten cargados, tenemos que volver a realizar la habilitacion de los Contraint y Trigger, para que la misma quede consistente.

Para esto, volvemos a ejecutar el cursor del primer paso, pero con la siguiente modificacion.

DECLARE	@Contraint	VARCHAR(255)
DECLARE	@Esquema	VARCHAR(255)
DECLARE	@Tabla		VARCHAR(255)
DECLARE	@Str		VARCHAR(MAX)

DECLARE CONSTRINT_CURSOR CURSOR FOR  
SELECT	OBJECT_NAME(OBJECT_ID) AS NameofConstraint, SCHEMA_NAME(schema_id) AS SchemaName, OBJECT_NAME(parent_object_id) AS TableName
FROM	sys.objects
WHERE	type_desc LIKE '%CONSTRAINT'
OPEN CONSTRINT_CURSOR   
FETCH NEXT FROM CONSTRINT_CURSOR INTO	@Contraint, @Esquema, @Tabla
WHILE @@FETCH_STATUS = 0        
BEGIN        
	--- Deshabilito Trigger
	SET	@Str= ''
	SET	@Str = 'ALTER TABLE ' + @Esquema + '.' + @Tabla + 'ENABLE TRIGGER ALL'
	EXEC (@Str)
	
	--- Deshabilito Contraint
	SET	@Str= ''
	SET	@Str = 'ALTER TABLE ' + @Esquema + '.' + @Tabla + 'CHECK CONSTRAINT' +  @Contraint
	EXEC (@Str)

FETCH NEXT FROM CONSTRINT_CURSOR INTO	@Contraint, @Esquema, @Tabla
END
CLOSE CONSTRINT_CURSOR
DEALLOCATE CONSTRINT_CURSOR