Tsql 从多个服务器获取所有数据库名称
我们有多个SQL Server,其中大多数是独立的。我需要创建一个存储过程/视图,将所有服务器的所有数据库名称插入到一个表中 有没有办法通过存储过程或视图来实现这一点?我没有任何powershell或.Net经验 这是我到目前为止所拥有的。我就是不知道如何从一个服务器跳到另一个服务器,并将所有结果添加到一个真正的表中Tsql 从多个服务器获取所有数据库名称,tsql,sql-server-2008-r2,ssrs-2008-r2,Tsql,Sql Server 2008 R2,Ssrs 2008 R2,我们有多个SQL Server,其中大多数是独立的。我需要创建一个存储过程/视图,将所有服务器的所有数据库名称插入到一个表中 有没有办法通过存储过程或视图来实现这一点?我没有任何powershell或.Net经验 这是我到目前为止所拥有的。我就是不知道如何从一个服务器跳到另一个服务器,并将所有结果添加到一个真正的表中 CREATE TABLE ##temp ( DATABASE_NAME VARCHAR(100), DATABASE_SIZE INT, REMARKS VARCHAR(500)
CREATE TABLE ##temp
(
DATABASE_NAME VARCHAR(100),
DATABASE_SIZE INT,
REMARKS VARCHAR(500)
)
INSERT into ##temp
EXEC [sp_databases]
--doing this to also get ServerName along with the db name.
--When I insert into a real table, I'll seperate it into two columns plus remove "@_!_@"
update ##temp
set DATABASE_NAME = (select @@SERVERNAME ) + '@_!_@ ' + DATABASE_NAME
where DATABASE_NAME not like '%@_!_@%'
select DATABASE_NAME from ##temp
SQLServerManagementStudio允许您使用该功能来执行。这是添加进来的,所以您不必担心兼容性 运行多服务器查询很容易:
视图
菜单中,选择“已注册的服务器”。这将打开一个类似于对象资源管理器的新窗口,显示单个服务器的对象李>
本地服务器组
文件夹中为所有服务器连接详细信息添加连接新建查询
。您在此处输入的查询将运行所有已注册服务器的查询从sys.databases
中选择*插入myManagementServer.MyDb.dbo.ThatTable…
SQL Server具有更强大的功能来管理多台服务器。您可以通过管理多台服务器,并通过策略将设置应用于多台服务器。2008年也增加了这一功能
在SQL Server 2008中,添加了R2,它更进一步,从多台服务器收集诊断、度量和性能数据,并将其存储在管理仓库中以进行报告。想象一下,能够看到多台服务器的存储和查询性能,或者过去X个月的可用空间趋势
缺点是历史数据需要空间。收集它还需要向所有受监视的服务器添加一些存储过程,尽管这是自动完成的。SQL Server Management Studio允许您使用该功能执行存储过程。这是添加进来的,所以您不必担心兼容性 运行多服务器查询很容易:
视图
菜单中,选择“已注册的服务器”。这将打开一个类似于对象资源管理器的新窗口,显示单个服务器的对象李>
本地服务器组
文件夹中为所有服务器连接详细信息添加连接新建查询
。您在此处输入的查询将运行所有已注册服务器的查询从sys.databases
中选择*插入myManagementServer.MyDb.dbo.ThatTable…
SQL Server具有更强大的功能来管理多台服务器。您可以通过管理多台服务器,并通过策略将设置应用于多台服务器。2008年也增加了这一功能
在SQL Server 2008中,添加了R2,它更进一步,从多台服务器收集诊断、度量和性能数据,并将其存储在管理仓库中以进行报告。想象一下,能够看到多台服务器的存储和查询性能,或者过去X个月的可用空间趋势
缺点是历史数据需要空间。收集它还需要向所有受监视的服务器添加一些存储过程,尽管这是自动完成的。对于这种情况,最好至少有一台服务器与您需要信息的所有服务器建立链接连接。如果你这样做了,你可以使用我刚才写的这个小脚本:
-- (1) Create global temp table used to store results
IF OBJECT_ID('tempdb..##databases') IS NOT NULL DROP TABLE ##databases;
CREATE TABLE ##databases
(
serverDBID int identity,
serverName varchar(100),
databaseName varchar(100),
databaseSize decimal(20,6)
);
-- (2) Create and populate table variable used to collect server names
DECLARE @servers TABLE(id int identity, serverName varchar(100));
INSERT @servers(serverName)
SELECT name FROM sys.servers;
-- (3) loop through each DB and collect database names into ##databases
DECLARE @i int = 1, @serverName varchar(100), @db varchar(100), @sql varchar(8000);
WHILE @i <= (SELECT COUNT(*) FROM @servers)
BEGIN
SELECT @serverName = serverName FROM @servers WHERE id = @i;
SET @sql = 'INSERT ##databases(serverName, databaseName) SELECT '''+@serverName+
''', name FROM master.sys.databases';
EXEC (@sql);
SET @i += 1;
END;
-- (4) Collect database sizes
SET @i = 1; -- reset/re-use @i;
WHILE @i <= (SELECT COUNT(*) FROM ##databases)
BEGIN
SELECT @serverName = serverName, @db = databaseName
FROM ##databases
WHERE serverDBID = @i;
SET @sql =
'UPDATE ##databases
SET databaseSize =
(SELECT sum(size)/128. FROM ['+@serverName+'].['+@db+'].sys.database_files)
WHERE serverDBID = '+CAST(@i AS varchar(4))+';'
BEGIN TRY
EXEC (@sql);
END TRY
BEGIN CATCH
PRINT 'There was an error getting dbsize info for '+@serverName+' > '+@db;
END CATCH;
SET @i += 1;
END;
-- Final Output
SELECT * FROM ##databases;
-(1)创建用于存储结果的全局临时表
如果对象ID('tempdb..##databases')不为空,则删除表##databases;
创建表##数据库
(
serverDBID int-identity,
服务器名varchar(100),
数据库名varchar(100),
数据库大小十进制(20,6)
);
--(2)创建并填充用于收集服务器名称的表变量
声明@servers表(id int-identity,serverName-varchar(100));
插入@servers(serverName)
从sys.servers中选择名称;
--(3)循环遍历每个数据库,并将数据库名称收集到##数据库中
声明@i int=1、@serverName varchar(100)、@db varchar(100)、@sql varchar(8000);
而@i对于这种情况,最好至少有一台服务器与您需要的所有服务器建立链接连接。如果你这样做了,你可以使用我刚才写的这个小脚本:
-- (1) Create global temp table used to store results
IF OBJECT_ID('tempdb..##databases') IS NOT NULL DROP TABLE ##databases;
CREATE TABLE ##databases
(
serverDBID int identity,
serverName varchar(100),
databaseName varchar(100),
databaseSize decimal(20,6)
);
-- (2) Create and populate table variable used to collect server names
DECLARE @servers TABLE(id int identity, serverName varchar(100));
INSERT @servers(serverName)
SELECT name FROM sys.servers;
-- (3) loop through each DB and collect database names into ##databases
DECLARE @i int = 1, @serverName varchar(100), @db varchar(100), @sql varchar(8000);
WHILE @i <= (SELECT COUNT(*) FROM @servers)
BEGIN
SELECT @serverName = serverName FROM @servers WHERE id = @i;
SET @sql = 'INSERT ##databases(serverName, databaseName) SELECT '''+@serverName+
''', name FROM master.sys.databases';
EXEC (@sql);
SET @i += 1;
END;
-- (4) Collect database sizes
SET @i = 1; -- reset/re-use @i;
WHILE @i <= (SELECT COUNT(*) FROM ##databases)
BEGIN
SELECT @serverName = serverName, @db = databaseName
FROM ##databases
WHERE serverDBID = @i;
SET @sql =
'UPDATE ##databases
SET databaseSize =
(SELECT sum(size)/128. FROM ['+@serverName+'].['+@db+'].sys.database_files)
WHERE serverDBID = '+CAST(@i AS varchar(4))+';'
BEGIN TRY
EXEC (@sql);
END TRY
BEGIN CATCH
PRINT 'There was an error getting dbsize info for '+@serverName+' > '+@db;
END CATCH;
SET @i += 1;
END;
-- Final Output
SELECT * FROM ##databases;
-(1)创建用于存储结果的全局临时表
如果对象ID('tempdb..##databases')不为空,则删除表##databases;
创建表##数据库
(
serverDBID int-identity,
服务器名varchar(100),
数据库名varchar(100),
数据库大小十进制(20,6)
);
--(2)创建并填充用于收集服务器名称的表变量
声明@servers表(id int-identity,serverName-varchar(100));
插入@servers(serverName)
从sys.servers中选择名称;
--(3)循环遍历每个数据库,并将数据库名称收集到##数据库中
声明@i int=1、@serverName varchar(100)、@db varchar(100)、@sql varchar(8000);
当@i时,您可以通过注册服务器
窗口对多台服务器执行查询,您可以通过注册服务器
窗口对多台服务器执行查询