Sql Server: Aplicar comando SHRINKDATABASE a todas las BDs

Versión 1:

/* Aplicar comando SHRINKDATABASE a todas las BDs, si no tiene backup se crea el backup en la ruta especificada */
DECLARE @BD nvarchar(250) ;
DECLARE BASESDEDATOS CURSOR FOR SELECT name FROM sys.databases WHERE database_id > 0  AND state<>6 and database_id not in (1,2,3,4) ;
OPEN BASESDEDATOS
FETCH NEXT FROM BASESDEDATOS INTO @BD
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'bd: ' + @BD
DECLARE @FECHAULTIMOBACKUP DATETIME
SELECT @FECHAULTIMOBACKUP=MAX(bus.backup_finish_date) FROM sys.sysdatabases sdb LEFT OUTER JOIN msdb.dbo.backupset bus ON bus.database_name = sdb.name WHERE sdb.Name = @BD GROUP BY sdb.Name;
IF @FECHAULTIMOBACKUP IS NULL
BEGIN
PRINT 'CREA BACKUP: ' + @BD
DECLARE @FECHA nvarchar(500)
DECLARE @NAME nvarchar(500)
DECLARE @DISK nvarchar(500)
SET @FECHA = (select replace(replace(replace(convert(varchar(19), getdate(), 126),'-',''),'T',''),':',''));
SET @NAME = @BD+'_'+@FECHA
SET @DISK = 'E:\backup_bd\'+@BD+'.bak'
PRINT @FECHA
PRINT @BD
PRINT @NAME
PRINT @DISK
BACKUP DATABASE @BD TO  DISK =@DISK WITH NOFORMAT, INIT,  NAME =@NAME, SKIP, NOREWIND, NOUNLOAD,  STATS = 10
PRINT 'CREA BACKUPbd: ' + @BD
END
backup log @BD TO DISK='NUL:'
DBCC SHRINKDATABASE(@BD)
FETCH NEXT FROM BASESDEDATOS INTO @BD
END
CLOSE BASESDEDATOS
DEALLOCATE BASESDEDATOS;



Versión 2:
/* Aplicar comando SHRINKDATABASE a todas las BDs que tiene por lo menos un Backup*/
DECLARE @BD nvarchar(250) ;
DECLARE BASESDEDATOS CURSOR FOR SELECT sdb.name FROM sys.databases sdb LEFT OUTER JOIN msdb.dbo.backupset bus ON bus.database_name = sdb.name WHERE sdb.database_id > 0  AND sdb.state<>6 and  sdb.database_id not in (1,2,3,4) GROUP BY sdb.Name having MAX(bus.backup_finish_date) is not null;
OPEN BASESDEDATOS
FETCH NEXT FROM BASESDEDATOS INTO @BD
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'bd: ' + @BD
backup log @BD TO DISK='NUL:'
DBCC SHRINKDATABASE(@BD)
FETCH NEXT FROM BASESDEDATOS INTO @BD
END
CLOSE BASESDEDATOS
DEALLOCATE BASESDEDATOS








Comentarios

Entradas populares