รับรายการฐานข้อมูลจาก SQL Server


381

ฉันจะรับรายการฐานข้อมูลที่มีอยู่บนอินสแตนซ์ของ SQL Server ได้อย่างไร ฉันวางแผนที่จะทำรายการของพวกเขาในกล่องคำสั่งผสมใน VB.NET

คำตอบ:


614

ดำเนินการ:

SELECT name FROM master.sys.databases

นี่เป็นวิธีที่ต้องการมากกว่าตอนนี้dbo.sysdatabasesซึ่งได้ถูกตัดออกไประยะหนึ่งแล้ว


ดำเนินการค้นหานี้:

SELECT name FROM master.dbo.sysdatabases

หรือถ้าคุณต้องการ

EXEC sp_databases

5
@Gia มันมีอยู่เป็นมุมมองที่เข้ากันได้ย้อนหลัง msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx
Chris Diver

4
EXEC sp_database ทำงานช้าสำหรับฉัน 40 วินาทีบนอินสแตนซ์ที่มีฐานข้อมูล 36 ฐาน การเลือกจากฐานข้อมูล sysd เป็นทันที
MarcE

10
หากต้องการขยายสิ่งที่ @ChrisDiver พูดว่า: SELECT name FROM sys.database เป็นวิธีการที่แนะนำในขณะนี้แทนที่จะเป็น dbo.sysdatabase ซึ่งเลิกใช้มานานกว่าทศวรรษแล้ว
คา

3
อย่างน้อยใน SQL Server 2014 exec sp_databasesไม่ทำงาน อีกสอง ( master.dbo.sysdatabasesและsys.databases) ยังคงทำงาน
r2evans

86

ในแง่ของความคลุมเครือเกี่ยวกับจำนวนฐานข้อมูลที่ไม่ใช่ผู้ใช้คุณอาจเพิ่ม:

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

และเพิ่มชื่อของฐานข้อมูลบริการรายงาน


53

ในการแยกฐานข้อมูลระบบ:

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

แก้ไข: 2:36 PM 2/5/2013

อัปเดตด้วย database_id ที่ถูกต้องควรมากกว่า 4 เพื่อข้ามรายการฐานข้อมูลระบบที่มี id ฐานข้อมูลระหว่าง 1 ถึง 4

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

7
สิ่งนี้ใช้ไม่ได้ บางทีคุณหมายถึง> 4 ตารางที่ 5 และ 6 เป็นตารางผู้ใช้
นักพัฒนานอกกล่อง

1
ดูเหมือนว่าควร> 4 แม้ว่าเซิร์ฟเวอร์ที่ฉันกำลังตรวจสอบจะมี "ReportServer" และ "ReportServerTempDB" ในตำแหน่ง 5 และ 6
Trisped

สำหรับฉัน> 6
Robb_2015

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

ทำงานบน SQL Server 2008 ของเรา


ฐานข้อมูลระบบที่มีID5 และ 6 จะเป็นอย่างไรReportServerและReportServerTempDBหากคุณSQL Server Reporting Servicesติดตั้งแล้ว
Charles Hepner

22

เนื่องจากคุณใช้. NET คุณสามารถใช้วัตถุการจัดการเซิร์ฟเวอร์ SQL

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();
Robb_2015

ฉันสงสัยว่ามัน (localhost) อ่านจากไฟล์กำหนดค่าบางอย่าง ฉันไม่สามารถใช้งานได้กับ "myhost" ของฉัน (ซึ่งเป็นชื่อโฮสต์ที่ถูกต้องของฉันพูดได้รับจาก
Ajeeb.KP

19

อย่าสับสนใช้แบบสอบถามง่ายๆด้านล่างเพื่อรับฐานข้อมูลทั้งหมด

select * from sys.databases

หากคุณต้องการเฉพาะฐานข้อมูลที่ผู้ใช้กำหนด

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

ชื่อฐานข้อมูลระบบบางส่วนคือ (ทรัพยากร, การแจกจ่าย, บริการรายงาน ,ervervetetetempdb) เพียงแค่ใส่ลงในแบบสอบถาม หากคุณมีฐานข้อมูลข้างต้นในเครื่องของคุณเป็นค่าเริ่มต้น


7
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB'

สิ่งนี้จะใช้ได้กับทั้งสองเงื่อนไขไม่ว่าจะเปิดใช้งานการรายงานหรือไม่


1
ระวังหากเซิร์ฟเวอร์ของคุณเป็นอินสแตนซ์ที่มีชื่อชื่อของ ReportServer db จะเหมือนกับ ReportServer $ InstanceName และ ReportServer $ InstanceNameTempDB ดังนั้นสิ่งนี้จะทำงานได้ทั้งสองวิธี: เลือก [ชื่อ] จาก master.dbo.sys ฐานข้อมูลที่ dbid> 4 และ [ชื่อ] ไม่เหมือน 'ReportServer%'
ToddK

5

ฉันใช้รหัสวัตถุการจัดการเซิร์ฟเวอร์ SQLต่อไปนี้เพื่อรับรายการฐานข้อมูลที่ไม่ใช่ฐานข้อมูลระบบและไม่ใช่สแนปชอต

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();
}

aeliner: var DBsLOC = new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases.Cast<Microsoft.SqlServer.Management.Smo.Database>().Where(bs => !bs.IsSystemObject && bs.ID>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

2

หากคุณต้องการละเว้นฐานข้อมูลระบบและตาราง ReportServer (ถ้าติดตั้ง):

select
            DATABASE_NAME   = db_name(s_mf.database_id)
             from
           sys.master_files s_mf
        where
            s_mf.state = 0 and -- ONLINE
            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_database " ระบบที่จัดเก็บ ฉันลบคอลัมน์ที่ไม่จำเป็นเท่านั้นและเพิ่มในที่ที่มีเงื่อนไข



1

ไม่แน่ใจว่าสิ่งนี้จะละเว้นฐานข้อมูลเซิร์ฟเวอร์รายงานเนื่องจากฉันไม่ได้ใช้งาน แต่จากสิ่งที่ฉันเห็นฉันสามารถละเว้นฐานข้อมูลผู้ใช้ระบบที่เป็นเจ้าของด้วย 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]

-1

บางทีฉันอาจจะเป็นโดโด!

show databases; ทำงานให้ฉัน


14
ไม่ได้อยู่ใน SQL Server
Martin Smith

1
คำตอบของฉันเพิ่งช่วยฉันอีกครั้ง #blessed
thedanotto

คำสั่งนี้ใช้งานได้สำหรับฉันเช่นกันผลลัพธ์อื่น ๆ แม้แต่อันที่มี 528 โหวตไม่ทำงาน
Brano

-4

ใน SQL Server 2008 R2 สามารถทำงานได้:

select name 
from master.sys.databases 
where owner_sid > 1;

และแสดงเฉพาะฐานข้อมูลที่สร้างโดยผู้ใช้


10
แก้ไข: นี่มันผิดมาก! owner_sid=1หมายถึงsaเจ้าของไม่มีอะไรพิเศษเกี่ยวกับมัน
wqw

-4

คุณสามารถค้นหาชื่อฐานข้อมูลทั้งหมดได้: -

 select name from sys.sysdatabases

2
ไม่เพิ่มอะไรเลยกับคำตอบที่โพสต์เมื่อหลายปีก่อน
Martin Smith

-4

ในการแยกฐานข้อมูลระบบ:

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

สิ่งนี้ไม่รวมฐานข้อมูลส่วนใหญ่ของฉัน
Jeff

ทำไมคุณเพิ่มส่วนคำสั่งที่ไหน? สิ่งนี้จะไม่รวมฐานข้อมูลระบบ OP ไม่ขอให้ทำเช่นนี้ และในครั้งต่อไปถ้าคุณเพิ่มคำตอบให้อธิบายสิ่งที่แบบสอบถามทำ และถัดจากนั้นไม่มีsidคอลัมน์อยู่บนsys.databasesโต๊ะowner_sid
Jordy van Eijk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.