mar
11
Written by:
njhhost
11. marts 2009
En gang i mellem får man brug for at rydde op i sine databaser, måske fordi en log backup har fejlet, der er for lidt diskplads eller hvad der nu kan hænde.
Jeg fandt dette lille handy script her og prøvede det lige "mæ de' wuns". Det virker!
Det opretter en temporær tabel,
fylder den med en kommando for hver eneste databasefil
eksempelvis: USE [AdventureWorks] DBCC SHRINKFILE (N'AdventureWorks_Data' , 1)
undtaget er systemdatabaser.
Så udføres hver enkelt kommando,
der skrives en linie om status
og de slettes i den temporære tabel undervejs.
DROP TABLE #CommandQueue
CREATE TABLE #CommandQueue
(
ID INT IDENTITY ( 1, 1 )
, SqlStatement VARCHAR(1000)
)
INSERT INTO #CommandQueue
(
SqlStatement
)
SELECT
'USE [' + A.name + '] DBCC SHRINKFILE (N''' + B.name + ''' , 1)'
FROM
sys.databases A
INNER JOIN sys.master_files B
ON A.database_id = B.database_id
WHERE
A.name NOT IN ( 'master', 'model', 'msdb', 'tempdb' )
DECLARE @id INT
SELECT @id = MIN(ID)
FROM #CommandQueue
WHILE @id IS NOT NULL
BEGIN
DECLARE @sqlStatement VARCHAR(1000)
SELECT
@sqlStatement = SqlStatement
FROM
#CommandQueue
WHERE
ID = @id
PRINT 'Executing ''' + @sqlStatement + '''...'
EXEC (@sqlStatement)
DELETE FROM #CommandQueue
WHERE ID = @id
SELECT @id = MIN(ID)
FROM #CommandQueue
END