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"来自第一个查询中的所有数据库名称列表.
谢谢你的帮助
使用带有动态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)