3

** * ****編集済み* ** * *

約 200 ~ 300 db の複数の SQL サーバーがあり、サーバーのスペースを節約したいと考えています。


タスク スケジューラを介してこのスクリプトを実行することにより、SQL サーバー内のすべてのデータベースで縮小ルーチンを実行したいと考えています。クエリはありますが、2 つを結び付ける方法がわかりません。すべてのデータベースを選択するには、これを使用します

select * from sys.sysdatabases
Where name <> 'master' and name <> 'tempdb' and name <> 'model' and name <> 'msdb'

私のシュリンクルートンにはこれを使用します

USE [single_database_name]
GO
DBCC SHRINKFILE ('single_database_name', 10)
GO

「single_database_name」が最初のクエリのすべてのデータベース名のリストから取得されるように、2 つのクエリを接続するにはどうすればよいですか。

ご協力いただきありがとうございます

4

5 に答える 5

5

動的 SQL でカーソルを使用します。これにより、各データベースで各ファイルが個別に圧縮されます。

Declare @dataFiles Table (databaseName Varchar(256), datafile Varchar(256))
Declare @SQL Nvarchar(Max), @databaseName Varchar(256), @dbfile Varchar(256)

Insert  @dataFiles
select  sd.name, smf.name
from    sys.sysdatabases sd
join    sys.master_files smf
        On  sd.[dbid] = smf.database_id
Where   sd.name not in ('master','tempdb','model','msdb')

Declare cur Cursor For      
Select  databaseName,
        datafile
From    @dataFiles

Open    cur
Fetch   Next 
From    cur
Into    @databaseName,
        @dbfile

While   @@Fetch_Status = 0
Begin
        Set     @SQL = 'USE [' + @databasename + ']
                        DBCC SHRINKFILE (''' + @dbfile + ''', 10) WITH NO_INFOMSGS'

        Exec    sp_executeSQL @SQL

        Fetch   Next 
        From    cur
        Into    @databaseName,
                @dbfile
End
Close   cur
Deallocate cur

select  sd.name As DatabaseName, smf.name DBFileName, (size*8)/1024 SizeMB
from    sys.sysdatabases sd
join    sys.master_files smf
        On  sd.[dbid] = smf.database_id
Where   sd.name not in ('master','tempdb','model','msdb')
于 2013-01-08T21:08:08.017 に答える
1
select 
'USE '+ quotename([name]) + '
GO
DBCC SHRINKFILE (''' + [name] + ''', 10)
GO
'
from sys.databases
where name not in ('master', 'tempdb', 'model', 'msdb')

ただし、これは行わないでください。縮小は悪いことです。

于 2013-01-08T21:16:12.943 に答える
0

文書化されていないストアド プロシージャ sp_MSForEachDB および DBCC SHRINKDATABASE コマンドを使用すると、SQL Server 上のすべてのデータベースを 1 行のコードで圧縮できます。

EXEC sp_MSForEachDB
  'if ''?'' not in (select name from sys.databases
    where name <> ''master'' and name <> ''tempdb'' and name <> ''model'' and name <> ''msdb'')
      DBCC SHRINKDATABASE([?], 10)'

sp_MSForEachDBに関する詳細情報

于 2013-01-08T21:25:13.527 に答える
0

大量のデータを削除し、データベースが元のサイズに戻ってスペースを再利用することがない場合など、非常に特殊な状況を除いて、データベースの縮小は避ける必要があります。データベースを圧縮すると、データが断片化し、パフォーマンスの問題が発生する可能性があります。

于 2013-01-08T22:21:27.040 に答える
-1

特定のデータベースを操作する場合は、データベースの名前について少なくとも知っている必要があります。その場合は、次のクエリを使用してください。

if (exists(Select name from sys.databases where name like 'single_database_name'))
begin 
DBCC SHRINKFILE ('single_database_name', 10)
end
于 2013-01-08T21:05:43.353 に答える