goodbyegangsterのブログ

備忘録的な

SQLServer : しきい値を決めてdatabaseを圧縮

SQLServerで、しきい値を決めてdatabaseを圧縮するTrasact-SQL。

DECLARE @UsedPerc int
SET @UsedPerc = (SELECT ROUND(FILEPROPERTY(name, 'SpaceUsed')/convert(float, size)*100, 0) as UsedPerc FROM sys.database_files where type_desc = 'ROWS')

IF @UsedPerc >= 80
BEGIN
  DECLARE @db_name sysname
  SET @db_name = (select db_name())
  DBCC SHRINKDATABASE ( @db_name, 10)
END

databaseの使用率を取得する部分で、sp_spaceusedプロシージャを利用できれば良かったのに、できんかった。sp_spaceusedが2つの結果セットを返してくるから、下みたいに書いてもエラーになってしまう。。。

DECLARE @table TABLE( 
        [TableName] SYSNAME, 
        [rows] BIGINT,
        [reserved] VARCHAR(25),
        [data] VARCHAR(25),
        [index_size] VARCHAR(25),
        [unused] VARCHAR(25)
         )
INSERT INTO @table EXEC sp_spaceused
SELECT * FROM @table

最新のSQLServerでは結果セットを1つにしてくれるオプションがあるらしいけど、SQLServer2012ではできんかったよ。