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

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)

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

有没有办法通过存储过程或视图来实现这一点?我没有任何powershell或.Net经验

这是我到目前为止所拥有的。我就是不知道如何从一个服务器跳到另一个服务器,并将所有结果添加到一个真正的表中

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
    中选择*
  • SSMS将从所有服务器收集结果,并将其显示在网格中。但是,如果要将结果转到单个服务器的表中,则必须将目标服务器作为链接服务器添加到所有其他服务器,并使用由四部分组成的名称作为目标表的目标,例如
    插入myManagementServer.MyDb.dbo.ThatTable…

    SQL Server具有更强大的功能来管理多台服务器。您可以通过管理多台服务器,并通过策略将设置应用于多台服务器。2008年也增加了这一功能

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


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

    SQL Server Management Studio允许您使用该功能执行存储过程。这是添加进来的,所以您不必担心兼容性

    运行多服务器查询很容易:

  • 视图
    菜单中,选择“已注册的服务器”。这将打开一个类似于对象资源管理器的新窗口,显示单个服务器的对象
  • 本地服务器组
    文件夹中为所有服务器连接详细信息添加连接
  • 右键单击本地服务器组文件夹并选择
    新建查询
    。您在此处输入的查询将运行所有已注册服务器的查询
  • 要查找所有数据库,请运行
    从sys.databases
    中选择*
  • SSMS将从所有服务器收集结果,并将其显示在网格中。但是,如果要将结果转到单个服务器的表中,则必须将目标服务器作为链接服务器添加到所有其他服务器,并使用由四部分组成的名称作为目标表的目标,例如
    插入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时,您可以通过
    注册服务器
    窗口对多台服务器执行查询,您可以通过
    注册服务器
    窗口对多台服务器执行查询