从多个服务器获取所有数据库名称

时间:2016-09-23 14:45:59

标签: tsql sql-server-2008-r2 ssrs-2008-r2

我们有多个SQL Server,其中大多数都是独立的。我需要创建一个存储过程/视图,将所有数据库名称插入到所有服务器的表中。

有没有办法通过存储过程或视图执行此操作?我没有任何powershell或.Net经验。

这是我到目前为止所拥有的。我无法弄清楚如何从服务器“跳转”到服务器并将我的所有结果添加到真实的表中。

happy

2 个答案:

答案 0 :(得分:2)

SQL Server Management Studio允许您使用query against multiple servers功能执行Registered Servers。这已添加到SQL Server 2008 as this tutorial shows中,因此您不必担心兼容性问题。

运行多服务器查询很简单:

  1. View菜单中选择“已注册的服务器”。这将打开一个类似于对象资源管理器的新窗口,该窗口显示单个服务器的对象。
  2. Local Server Groups文件夹
  3. 中的所有服务器连接详细信息添加连接
  4. 右键单击“本地服务器组”文件​​夹,然后选择New Query。您在此处输入的查询将运行所有已注册的服务器。
  5. 查找所有运行select * from sys.databasessp_databases
  6. 的数据库

    SSMS将从所有服务器收集结果并将其显示在网格中。如果您希望结果转到单个服务器的表,则必须将目标服务器作为链接服务器添加到所有其他服务器,并使用四部分名称来定位目标表,例如INSERT INTO myManagementServer.MyDb.dbo.ThatTable... < / p>

    SQL Server具有更强大的功能,可用于管理多个服务器。您可以通过Central Management Server管理多个服务器,并通过策略将设置应用于多个服务器。该功能也在2008年添加。

    在SQL Server 2008 R2中添加了SQL Server Utility,它甚至更进一步,从多个服务器收集诊断,指标,性能数据,并将其存储在管理仓库中进行报告。想象一下,能够看到多个服务器的存储和查询性能,或过去X个月的自由空间趋势。

    缺点是历史数据需要空间。收集它还需要向所有受监视的服务器添加一些存储过程,尽管这是自动完成的。

答案 1 :(得分:1)

对于这种事情,至少有一台服务器与您需要信息的所有服务器具有链接连接是件好事。如果你这样做,你可以使用我刚写的这个小脚本:

-- (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;