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

是否可以在不使用名称的情况下查询SQL server中的系统数据库?

  •  6
  • edosoft  · 技术社区  · 14 年前

    在SQLServer(2005+)中对多个数据库执行查询时,我发现有时需要排除系统数据库(master、model、tempdb、msdb和distribution)

    除此之外还有别的方法过滤这些吗

    where name not in (''master', 'model', 'tempdb', 'msdb', 'distribution')
    

    我看过sys.databases和master.dbo.sysdatabases(不一样!)

    select d.name, p.last_backup_date, s.secondary_server, s.secondary_database
    from sys.databases d
        left outer join msdb..log_shipping_primary_databases p on p.primary_database = d.name
        left outer join msdb..log_shipping_primary_secondaries s on s.primary_id = p.primary_id
    where name not in ('model','master','tempdb','distribution','msdb')
    order by d.name
    

    [更新]这似乎是“最不坏”的方法,除非其他人有更好的方法?

    SELECT * FROM 
    master.sys.databases AS dtb 
    WHERE (dtb.database_id < 5 or dtb.is_distributor = 1)
    
    3 回复  |  直到 14 年前
        1
  •  7
  •   Martin Smith    14 年前

    我运行了SQL Profiler并刷新了managementstudio中的system databases节点。它使用查询

    ...FROM
    master.sys.databases AS dtb
    WHERE
    (CAST(case when dtb.name in ('master','model','msdb','tempdb') 
    then 1 else dtb.is_distributor end AS bit)=1)
    

    所以我想你可以把 dbid is_distributor

        2
  •  3
  •   Thomas    14 年前

    除了搜索名字之外,没有其他安全的方法。如果您只想过滤掉四个主要数据库(master、model、msdb、tempdb),那么可以安全地在 DBID > 4

        3
  •  -1
  •   Mohammad Anini saravanajd    8 年前
    select
        *
    from
        sys.databases
    where
        name in ('master','model','msdb','tempdb')
        or is_distributor = 1