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

Wil*_*lNZ 3 sql sql-server ssms

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

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


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

select * from sys.sysdatabases
Where name <> 'master' and name <> 'tempdb' and name <> 'model' and name <> 'msdb'
Run Code Online (Sandbox Code Playgroud)

对于我的收缩路线,我使用它

USE [single_database_name]
GO
DBCC SHRINKFILE ('single_database_name', 10)
GO
Run Code Online (Sandbox Code Playgroud)

如何连接两个查询,以便"single_database_name"来自第一个查询中的所有数据库名称列表.

谢谢你的帮助

Eri*_*ice 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')
Run Code Online (Sandbox Code Playgroud)