查询以选择所有数据库,然后对结果运行另一个查询

时间:2013-01-08 20:59:14

标签: sql sql-server ssms

** * **** EDITED < EM> * ** * *

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


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

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

感谢您的帮助

5 个答案:

答案 0 :(得分: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')

答案 1 :(得分:1)

select 
'USE '+ quotename([name]) + '
GO
DBCC SHRINKFILE (''' + [name] + ''', 10)
GO
'
from sys.databases
where name not in ('master', 'tempdb', 'model', 'msdb')

但请不要这样做:萎缩是不好的。

答案 2 :(得分: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

的更多信息

答案 3 :(得分:0)

应避免缩小数据库,除非在非常特定的情况下,例如删除大量数据的地方,数据库永远不会恢复到原始大小并回收空间。缩小数据库会使数据分段,并可能导致性能问题。

答案 4 :(得分:-1)

对于在特定数据库上操作,您将至少知道数据库的名称,如果是这种情况,则使用以下查询

if (exists(Select name from sys.databases where name like 'single_database_name'))
begin 
DBCC SHRINKFILE ('single_database_name', 10)
end