3

** * ****已编辑* ** * *

我有多个 sql 服务器,其中包含大约 200-300 dbs,并且想要节省服务器上的空间。


我想通过任务调度程序运行此脚本,在我的 sql 服务器中的所有数据库上运行收缩例程。我有疑问,但我不知道如何将两者联系在一起。为了选择所有数据库,我使用这个

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”来自第一个查询的所有数据库名称列表。

谢谢你的帮助

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 上的所有数据库

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 回答