2010-08-03 68 views
5

在做了在SQL服務器的多個數據庫查詢(2005+)我覺得有時necesary排除系統數據庫(大師,模型,tempdb數據庫,MSDB和分發)是否可以在不使用名稱的情況下查詢SQL服務器中的系統數據庫?

是否有除了過濾這些任何其他方式

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

我看sys.databases中和master.dbo.sysdatabases中(不一樣的!)

[更新]我用它來尋找那些具有logshipping啓用

數據庫查詢示例
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) 
+1

你能給我們舉一個你正在運行什麼查詢的例子嗎? – Codesleuth 2010-08-03 14:04:27

+0

添加了示例查詢。 – edosoft 2010-08-03 14:15:18

回答

6

我運行SQL事件探查器並刷新管理工作室中的系統數據庫節點。它使用查詢

...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) 

所以我想你可以結合dbidis_distributor檢查。

3

沒有安全的手段,除了搜索名稱。如果您只想過濾出四個主數據庫(master,model,msdb,tempdb),則可以安全地過濾DBID > 4。但是,分發數據庫將像普通數據庫一樣獲得DBID,因此您不能依賴其DBID。

+0

謝謝。我注意到了分發DBID,這是我的問題的根本原因。 – edosoft 2010-08-03 14:31:27

0
select 
    * 
from 
    sys.databases 
where 
    name in ('master','model','msdb','tempdb') 
    or is_distributor = 1 
相關問題