T-SQL - 列出网络中所有服务器上的所有数据库

时间:2013-11-18 23:23:44

标签: sql-server osql

我正在尝试审核网络,查找并清理可能已经过测试和遗忘的旧数据库。

现在,我知道我可以使用SQLCMD -L来查看服务器和实例。 如果Management Studio连接到服务器,我可以使用exec sp_helpdb来获取服务器名称,数据库名称,大小,所有者,已创建和状态。

这两者本身都很棒,但它们需要连接到MGMT Studio中的每个服务器,然后对注册服务器组运行以下查询。

我希望创建一个以下查询的循环来遍历SQLCMD -L找到的所有数据库,这样我就可以通过SQLCMS / OSQL发送清理审计结果,以避免手册连接过程。我也可能需要为他们制定适当的登录帐户,所以如果在这个混乱中有选项,那也会很棒(Sa,Win Auth,SQL Auth等)

如果有人对解决方案有任何建议,将其作为自动化流程运行,我们将不胜感激。

create table #temp
(
name sysname
,db_size nvarchar(13)
,owner sysname
,dbid smallint
,created smalldatetime--nvarchar(11)
,status nvarchar(600)
,compatibility_level tinyint
)
go
insert into #temp
exec sp_helpdb

ALTER TABLE #temp
DROP COLUMN dbid
ALTER TABLE #temp
DROP COLUMN status
ALTER TABLE #temp
DROP COLUMN compatibility_level


select * from #temp
where name not like'master%'
AND name not like 'model%'
AND name not like 'msdb%'
AND name not like 'ems_master%'
AND name not like 'tempdb%'
AND name not like 'ReportServer%'
AND name not like 'HR'
AND name not like 'EMS_Personnel%'
order by created
drop table #temp 

2 个答案:

答案 0 :(得分:0)

如果将该查询保存为batch.sql,则可以打开Powershell窗口,cd到batch.sql所在的目录,然后运行:

sqlcmd -L | ? {$_ -ne "Servers:"} | ? {$_ -ne ""} | % { sqlcmd -S $_ -b -i batch.sql}

这将为您运行sqlcmd -L,过滤掉非服务器名称的行,然后连接到每个服务器并在batch.sql中运行T-SQL代码。如果您需要添加用户名和密码,可以将-U-P标志添加到第二个sqlcmd命令。

答案 1 :(得分:0)

for /f "tokens=*" %%i in ('SQLCMD -L') do (
Echo Working on %%i
SQLCMD -E -S %%i -Q "exec sp_helpdb" -o "C:\Temp\BillieTest\ServerDatabases.csv" -s"," -W -w 999
Echo %%i Processed. 
)

我能够用它来循环命令。它没有解决多次登录的问题,但我将努力获得统一的Windows身份验证登录来运行它。

感谢那些观看过的人,我仍然欢迎任何更好的选择! :)