2010-08-03 2 views
5

Bei einer Abfrage über mehrere Datenbanken im SQL Server (2005+) finde ich es manchmal notwendig, die Systemdatenbank (Master, Model, tempdb, msdb und distribution) auszuschließenIst es möglich, die Systemdatenbanken im SQL-Server abzufragen, ohne die Namen zu verwenden?

Gibt es eine andere Möglichkeit, diese zu filtern

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

ich habe bei sys.databases und master.dbo.sysdatabases sah (nicht dasselbe!)

[UPDATE] ein Beispiel Abfrage, die ich für Datenbanken suchen verwenden, die Logshipping

aktiviert haben
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 

[UPDATE] Dies scheint der "schlechteste" Weg zu sein, es sei denn, jemand anders hat einen besseren Weg?

SELECT * FROM 
master.sys.databases AS dtb 
WHERE (dtb.database_id < 5 or dtb.is_distributor = 1) 
+1

Können Sie uns ein Beispiel dafür geben, welche Abfragen Sie ausführen? – Codesleuth

+0

Beispiel Abfrage hinzugefügt. – edosoft

Antwort

6

Ich habe SQL Profiler ausgeführt und den Systemdatenbanken Knoten in Management Studio aktualisiert. Es verwendet die Abfrage

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

Also ich denke, Sie die dbid und is_distributor Kontrollen kombinieren könnte.

3

Es gibt keine sicheren Mittel über die Suche nach dem Namen hinaus. Wenn Sie nur die vier Hauptdatenbanken (Master, Model, msdb, tempdb) ausfiltern möchten, können Sie sicher auf DBID > 4 filtern. Die Verteilungsdatenbank erhält jedoch eine DBID wie eine normale Datenbank und Sie können sich daher nicht auf ihre DBID verlassen.

+0

Danke. Ich habe auch die Verteilungs-DBID bemerkt, das ist der Grund für meine Frage. – edosoft

0
select 
    * 
from 
    sys.databases 
where 
    name in ('master','model','msdb','tempdb') 
    or is_distributor = 1 
Verwandte Themen