代码之家  ›  专栏  ›  技术社区  ›  Jay

如何通过t-sql获取所有用户数据库的列表?

  •  11
  • Jay  · 技术社区  · 15 年前

    我想从mssql服务器实例获取所有用户数据库的列表。最好的方法是什么?

    我知道我可以从sys.databases中进行选择,但除了硬编码要排除的名称列表之外,我看不到任何过滤系统数据库的方法。

    我需要脚本在2000/2005和2008年工作。

    8 回复  |  直到 15 年前
        1
  •  17
  •   gvee    9 年前

    Object Explorer > System Databases

    事实证明,微软实施的解决方案非常简单,归结起来如下:

    SELECT *
    FROM   master.sys.databases
    WHERE  Cast(CASE WHEN name IN ('master', 'model', 'msdb', 'tempdb') THEN 1 ELSE is_distributor END As bit) = 0
    

    SSMS 2008R2 (10.50.4033.0).

        2
  •  8
  •   Maestro    12 年前

    Select * 
    From sys.databases
    

    从这个表中,您会注意到您可以通过使用 WHERE 条款例如,以下查询基本上将返回相同的结果表(您最可能要查找的结果表):

    Select * 
    From sys.databases 
    Where database_id > 5
    
    
    Select * 
    From sys.databases 
    Where len(owner_sid)>1
    

    这些查询将在SQL Server 2008和2012中运行。

        3
  •  6
  •   BillB    10 年前

    我能使用的唯一可靠方法是:

    SELECT name FROM sys.databases
    WHERE name NOT IN ('master', 'model', 'tempdb', 'msdb', 'Resource')
    
        4
  •  4
  •   brendan    15 年前

    这在2005年起作用,对其他版本没有100%的把握,但我认为它会飞起来。这有点像黑客,但可能会满足您的需要:

     select * from sys.databases where len(owner_sid)>1
    
        5
  •  3
  •   JohnFx    15 年前

    听起来就像硬编码一样恶心。对于几个版本的SQL,系统数据库的名称和数量相当一致。然而,如果这太令人不快,您可以将它们半硬编码到一个表中,然后将其插入查询中。

        6
  •  0
  •   Joe    15 年前

    我不确定你是否能马上就来。注意:在2k上,您必须使用master.dbo.sysdatabases,而不是master.sys.databases(2k中不存在)。

        7
  •  0
  •   pim    6 年前

    从SQL Server 2008开始,您可以访问名为 sys.databases 当加入 sys.server_principals sa 您(通常)可以安全地识别的是“系统数据库”。因此,允许您筛选出这些项。

    select
      d.name
      ,d.database_id
    from
      sys.databases d
    join
      sys.server_principals p
      on p.sid = d.owner_sid
    where
      p.name <> 'sa';