【问题标题】:Get list of databases from SQL Server从 SQL Server 获取数据库列表
【发布时间】:2010-09-13 22:37:49
【问题描述】:

如何获取 SQL Server 实例上的可用数据库列表?我打算在 VB.NET 的组合框中列出它们。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    执行:

    SELECT name FROM master.sys.databases

    这是现在的首选方法,而不是 dbo.sysdatabases,后者已被弃用一段时间。


    执行这个查询:

    SELECT name FROM master.dbo.sysdatabases
    

    或者如果你喜欢

    EXEC sp_databases
    

    【讨论】:

    • @Gia 它确实作为向后兼容视图存在。 msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx
    • EXEC sp_databases 为我执行;在具有 36 个数据库的实例上需要 40 秒。从 sysdatabases 中选择是即时的。
    • 扩展@ChrisDiver 所说的内容:SELECT name FROM sys.databases 是现在的首选方法,而不是 dbo.sysdatabases,它已经被弃用了十年。
    • 至少在 SQL Server 2014 上,exec sp_databases 不起作用。另外两个(master.dbo.sysdatabasessys.databases)仍然有效。
    【解决方案2】:

    鉴于非用户数据库的数量不明确,您可能应该添加:

    WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
    

    并添加报告服务数据库的名称

    【讨论】:

      【解决方案3】:

      排除系统数据库:

      SELECT [name]
      FROM master.dbo.sysdatabases
      WHERE dbid > 6
      

      已编辑:2013 年 2 月 5 日下午 2:36

      用准确的database_id更新,它应该大于4,跳过列表 数据库 ID 介于 1 和 4 之间的系统数据库。

      SELECT * 
      FROM sys.databases d
      WHERE d.database_id > 4
      

      【讨论】:

      • 这不起作用。也许你的意思是> 4?表 5 和 6 是用户表。
      • 它看起来应该总是 > 4,虽然我正在检查的服务器在 5 和 6 位置有“ReportServer”和“ReportServerTempDB”。
      【解决方案4】:
      SELECT [name] 
      FROM master.dbo.sysdatabases 
      WHERE dbid > 4 
      

      适用于我们的 SQL Server 2008

      【讨论】:

      • 如果您安装了SQL Server Reporting Services,则具有ID 5 和6 的系统数据库将为ReportServerReportServerTempDB
      【解决方案5】:

      不要迷惑,使用下面的简单查询来获取所有数据库,

      select * from sys.databases
      

      如果你只需要用户定义的数据库;

      select * from sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb'); 
      

      一些系统数据库名称是 (resource,distribution,reportservice,reportservicetempdb) 只需将其插入到查询中。 如果您的机器中默认有上述数据库。

      【讨论】:

        【解决方案6】:

        由于您使用的是 .NET,因此您可以使用 SQL Server Management Objects

        Dim server As New Microsoft.SqlServer.Management.Smo.Server("localhost")
        For Each db As Database In server.Databases
            Console.WriteLine(db.Name)
        Next
        

        【讨论】:

        • var SDBLOC = new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases.Cast<Microsoft.SqlServer.Management.Smo.Database>().Where(bs => !bs.IsSystemObject && bs.ID>6).ToList();
        • 我怀疑它(本地主机)是从某个配置文件中读取的。我无法使用我的“myhost”(这是我的正确主机名,例如由 Environment.MachineName 获得)。如果我将“localhost”替换为“myhost”,这会起作用吗?
        【解决方案7】:
        SELECT [name] 
        FROM master.dbo.sysdatabases 
        WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB'
        

        这适用于两种情况,无论是否启用报告

        【讨论】:

        • 注意,如果您的服务器是命名实例,则 ReportServer 数据库名称类似于 ReportServer$InstanceName 和 ReportServer$InstanceNameTempDB。因此,无论哪种方式都可以:SELECT [name] FROM master.dbo.sysdatabases WHERE dbid > 4 and [name] NOT LIKE 'ReportServer%'
        【解决方案8】:

        我使用以下SQL Server Management Objects 代码来获取不是系统数据库且不是快照的数据库列表。

        using Microsoft.SqlServer.Management.Smo;
        
        public static string[] GetDatabaseNames( string serverName )
        {
           var server = new Server( serverName );
           return ( from Database database in server.Databases 
                    where !database.IsSystemObject && !database.IsDatabaseSnapshot
                    select database.Name 
                  ).ToArray();
        }
        

        【讨论】:

        • oneliner:var DBsLOC = new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases.Cast&lt;Microsoft.SqlServer.Management.Smo.Database&gt;().Where(bs =&gt; !bs.IsSystemObject &amp;&amp; bs.ID&gt;6).ToList();foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases) ,如 .NET 4.0 + SQL Server 2014 或 .SqlServer.Smo\12.0.0.0
        【解决方案9】:

        如果您想省略系统数据库和 ReportServer 表(如果已安装)

        select DATABASE_NAME = db_name(s_mf.database_id)
        from sys.master_files s_mf
        where
            s_mf.state = 0 -- ONLINE
            and has_dbaccess(db_name(s_mf.database_id)) = 1
            and db_name(s_mf.database_id) NOT IN ('master', 'tempdb', 'model', 'msdb')
            and db_name(s_mf.database_id) not like 'ReportServer%'
        group by s_mf.database_id
        order by 1;
        

        这适用于 SQL Server 2008/2012/2014。大多数查询来自“sp_databases”系统存储过程。我只删除了不需要的列并添加了 where 条件。

        【讨论】:

        • 虽然其他一些 SQL 代码运行良好,但这确保了数据库也在线,这是我一直在寻找的标准之一。
        【解决方案10】:

        也许我是一只渡渡鸟!

        show databases; 为我工作。

        【讨论】:

        • 不在 SQL Server 中
        • 这个命令也对我有用,其他结果即使是 528 票也不起作用。
        • 您确定您使用的是 MSSQL 吗?不是MySQL
        • 我不知道我在做什么,但有些人觉得这很有帮助
        【解决方案11】:

        在 SQL Server 7 中,dbid 1 到 4 是系统 dbs。

        【讨论】:

          【解决方案12】:

          不确定这是否会省略报告服务器数据库,因为我没有运行报告服务器数据库,但据我所知,我可以使用以下 SQL 省略系统用户拥有的数据库:

              SELECT  db.[name] as dbname 
              FROM [master].[sys].[databases] db
              LEFT OUTER JOIN  [master].[sys].[sysusers] su on su.sid = db.owner_sid
              WHERE su.sid is null
              order by db.[name]
          

          【讨论】:

            【解决方案13】:

            如果您正在寻找一个命令来在 MYSQL 中列出数据库,那么只需使用以下命令。登录sql server后,

            显示数据库;

            【讨论】:

            【解决方案14】:

            排除系统数据库:

            SELECT name FROM master.dbo.sysdatabases where sid <>0x01
            

            【讨论】:

            • 这排除了我的大部分数据库。
            • 为什么要添加 where 子句?这将排除系统数据库,OP 没有要求这样做。下次如果您添加答案,请解释查询的作用。旁边没有sid 它在sys.databases 表上的列owner_sid
            猜你喜欢
            • 2012-03-13
            • 1970-01-01
            • 2011-08-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多