jueves, 21 de febrero de 2013

Ver información de todas las tablas de una base de datos.


He creado el siguiente script que nos permite listar todas las tablas en una base de datos SQL Server con los detalles del espacio utilizado y los tipos de índices en cada una de ellas; esta información es útil para manejar nuestras bases de datos de SQL Server.

SELECT sys.tables.name AS [TABLE], sys.tables.create_date AS CREATE_DATE,
sys.tables.modify_date AS MODIFY_DATE,
CASE WHEN sys.database_principals.name IS NULL THEN SCHEMA_NAME(sys.tables.schema_id)
ELSE sys.database_principals.name END AS OWNER,
SUM(ISNULL(CASE INDEXES.TYPE WHEN 0 THEN COUNT_TYPE END, 0)) AS COUNT_HEAP_INDEX,
SUM(ISNULL(CASE INDEXES.TYPE WHEN 1 THEN COUNT_TYPE END, 0)) AS COUNT_CLUSTERED_INDEX,
SUM(ISNULL(CASE INDEXES.TYPE WHEN 2 THEN COUNT_TYPE END, 0)) AS COUNT_NONCLUSTERED_INDEX,
SUM(ISNULL(CASE INDEXES.TYPE WHEN 3 THEN COUNT_TYPE END, 0)) AS COUNT_XML_INDEX,
SUM(ISNULL(CASE INDEXES.TYPE WHEN 4 THEN COUNT_TYPE END, 0)) AS COUNT_SPATIAL_INDEX,
sys.tables.max_column_id_used AS COUNT_COLUMNS, sys.partitions.rows AS COUNT_ROWS,
SUM(ISNULL(CASE WHEN sys.allocation_units.type <> 1 THEN USED_PAGES
WHEN SYS.partitions.INDEX_ID < 2 THEN DATA_PAGES ELSE 0 END, 0)) *
(SELECT low / 1024 AS VALUE FROM master.dbo.spt_values
WHERE (number = 1) AND (type = N'E')) AS SIZE_DATA_KB,
SUM(ISNULL(sys.allocation_units.used_pages - CASE WHEN sys.allocation_units.type <> 1 THEN USED_PAGES
WHEN SYS.partitions.INDEX_ID < 2 THEN DATA_PAGES ELSE 0 END, 0)) * (SELECT low / 1024 AS VALUE
FROM master.dbo.spt_values AS spt_values_2 WHERE (number = 1) AND (type = N'E')) AS SIZE_INDEX_KB
FROM sys.allocation_units INNER JOIN sys.partitions ON sys.allocation_units.container_id = sys.partitions.partition_id
INNER JOIN (SELECT TOP (100) PERCENT object_id, index_id, type AS TYPE, COUNT(*) AS COUNT_TYPE
FROM sys.indexes AS indexes_1 GROUP BY object_id, type, index_id ORDER BY object_id) AS INDEXES ON
sys.partitions.object_id = INDEXES.object_id AND sys.partitions.index_id = INDEXES.index_id RIGHT OUTER JOIN
sys.database_principals RIGHT OUTER JOIN sys.tables ON sys.database_principals.principal_id = sys.tables.principal_id ON
INDEXES.object_id = sys.tables.object_id GROUP BY sys.tables.name, sys.tables.create_date, sys.tables.modify_date,
CASE WHEN sys.database_principals.name IS NULL THEN SCHEMA_NAME(sys.tables.schema_id) ELSE sys.database_principals.name END,
sys.tables.max_column_id_used, sys.partitions.rows
ORDER BY COUNT_ROWS DESC


Como siempre espero que lo prueben y les sea de mucha utilidad.

Clic aquí para descargar el script.

jueves, 7 de febrero de 2013

Listar Jobs con información de la programación


He creado el siguiente Script el cual nos permitirá listar todos los Jobs activos en un servidor de SQL Server con el detalle de la programación para la ejecución de cada uno de ellos; esta información es de mucha ayuda para mantener actualizada la documentación de nuestros servidores de SQL Server.

USE msdb
SELECT sysjobs.name AS NOMBRE_JOB, CASE freq_type
WHEN 1 THEN 'Una sola vez'
WHEN 4 THEN 'Diariamente'
WHEN 8 THEN 'Semanalmente'
WHEN 16 THEN 'Mensualmente'
WHEN 32 THEN 'Mensualmente'
WHEN 64 THEN 'Se ejecuta cuando se inicia el servicio del Agente SQL Server'
WHEN 128 THEN 'Se ejecuta cuando el equipo está inactivo ' END AS FRECUENCIA, CASE freq_type
WHEN 4 THEN 'Cada ' + CAST(freq_interval  AS VARCHAR) + ' Día(s).'
WHEN 8 THEN
      CASE WHEN freq_interval & 1 = 1 THEN 'Domingo ' ELSE '' END +
      CASE WHEN freq_interval & 2 = 2 THEN 'Lunes ' ELSE '' END +
      CASE WHEN freq_interval & 4 = 4 THEN 'Martes ' ELSE '' END +
      CASE WHEN freq_interval & 8 = 8 THEN 'Miércoles ' ELSE '' END +
      CASE WHEN freq_interval & 16 = 16 THEN 'Jueves ' ELSE '' END +
      CASE WHEN freq_interval & 32 = 32 THEN 'Viernes ' ELSE '' END +
      CASE WHEN freq_interval & 64 = 64 THEN 'Sábado ' ELSE '' END + 'cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' semana(s).'
WHEN 16 THEN 'En el día '  + CAST(freq_interval  AS VARCHAR) + ' de cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' mes(es).'
WHEN 32 THEN
      CASE WHEN freq_relative_interval = 1 THEN 'Cada primer ' ELSE '' END +
      CASE WHEN freq_relative_interval = 2 THEN 'Cada segundo ' ELSE '' END +
      CASE WHEN freq_relative_interval = 4 THEN 'Cada tercer ' ELSE '' END +
      CASE WHEN freq_relative_interval = 8 THEN 'Cada cuarto ' ELSE '' END +
      CASE WHEN freq_relative_interval = 16 THEN 'Cada último ' ELSE '' END +
      CASE freq_interval     
      WHEN 1 THEN 'Domingo de cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' mes(es).'
      WHEN 2 THEN 'Lunes de cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' mes(es).'
      WHEN 3 THEN 'Martes de cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' mes(es).'
      WHEN 4 THEN 'Miércoles de cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' mes(es).'
      WHEN 5 THEN 'Jueves de cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' mes(es).'
      WHEN 6 THEN 'Viernes de cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' mes(es).'
      WHEN 7 THEN 'Sábado de cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' mes(es).'
      WHEN 8 THEN 'día de cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' mes(es).'
      WHEN 9 THEN 'día de la semana de cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' mes(es).'
      WHEN 10 THEN 'fin de semana de cada ' + CAST(freq_recurrence_factor  AS VARCHAR) + ' mes(es).' END END AS PROGRAMACION,
CAST(CAST(sysschedules.active_start_time / 10000 AS VARCHAR(2)) + ':' + CAST(LEFT(RIGHT(sysschedules.active_start_time, 4), 2)
AS VARCHAR(2)) + ':' + CAST(RIGHT(sysschedules.active_start_time, 2) AS VARCHAR(2)) AS TIME(0)) AS HORA_EJECUCION
FROM sysschedules INNER JOIN
sysjobschedules ON sysschedules.schedule_id = sysjobschedules.schedule_id RIGHT OUTER JOIN
sysjobs ON sysjobschedules.job_id = sysjobs.job_id
WHERE (sysjobs.enabled = 1)
ORDER BY HORA_EJECUCION

Como siempre espero que lo prueben y les sea de mucha utilidad.

Clic aquí para descargar el script.