ฉันจะรับรายการฐานข้อมูลที่มีอยู่บนอินสแตนซ์ของ SQL Server ได้อย่างไร ฉันวางแผนที่จะทำรายการของพวกเขาในกล่องคำสั่งผสมใน VB.NET
ฉันจะรับรายการฐานข้อมูลที่มีอยู่บนอินสแตนซ์ของ SQL Server ได้อย่างไร ฉันวางแผนที่จะทำรายการของพวกเขาในกล่องคำสั่งผสมใน VB.NET
คำตอบ:
ดำเนินการ:
SELECT name FROM master.sys.databases
นี่เป็นวิธีที่ต้องการมากกว่าตอนนี้dbo.sysdatabases
ซึ่งได้ถูกตัดออกไประยะหนึ่งแล้ว
ดำเนินการค้นหานี้:
SELECT name FROM master.dbo.sysdatabases
หรือถ้าคุณต้องการ
EXEC sp_databases
exec sp_databases
ไม่ทำงาน อีกสอง ( master.dbo.sysdatabases
และsys.databases
) ยังคงทำงาน
ในแง่ของความคลุมเครือเกี่ยวกับจำนวนฐานข้อมูลที่ไม่ใช่ผู้ใช้คุณอาจเพิ่ม:
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
และเพิ่มชื่อของฐานข้อมูลบริการรายงาน
ในการแยกฐานข้อมูลระบบ:
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
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4
ทำงานบน SQL Server 2008 ของเรา
ID
5 และ 6 จะเป็นอย่างไรReportServer
และReportServerTempDB
หากคุณSQL Server Reporting Services
ติดตั้งแล้ว
เนื่องจากคุณใช้. 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();
อย่าสับสนใช้แบบสอบถามง่ายๆด้านล่างเพื่อรับฐานข้อมูลทั้งหมด
select * from sys.databases
หากคุณต้องการเฉพาะฐานข้อมูลที่ผู้ใช้กำหนด
select * from sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
ชื่อฐานข้อมูลระบบบางส่วนคือ (ทรัพยากร, การแจกจ่าย, บริการรายงาน ,ervervetetetempdb) เพียงแค่ใส่ลงในแบบสอบถาม หากคุณมีฐานข้อมูลข้างต้นในเครื่องของคุณเป็นค่าเริ่มต้น
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB'
สิ่งนี้จะใช้ได้กับทั้งสองเงื่อนไขไม่ว่าจะเปิดใช้งานการรายงานหรือไม่
ฉันใช้รหัสวัตถุการจัดการเซิร์ฟเวอร์ 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();
}
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 \
หากคุณต้องการละเว้นฐานข้อมูลระบบและตาราง 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 " ระบบที่จัดเก็บ ฉันลบคอลัมน์ที่ไม่จำเป็นเท่านั้นและเพิ่มในที่ที่มีเงื่อนไข
ใน SQL Server 7 dbid 1 ถึง 4 เป็นระบบ dbs
ไม่แน่ใจว่าสิ่งนี้จะละเว้นฐานข้อมูลเซิร์ฟเวอร์รายงานเนื่องจากฉันไม่ได้ใช้งาน แต่จากสิ่งที่ฉันเห็นฉันสามารถละเว้นฐานข้อมูลผู้ใช้ระบบที่เป็นเจ้าของด้วย 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]
บางทีฉันอาจจะเป็นโดโด!
show databases;
ทำงานให้ฉัน
ใน SQL Server 2008 R2 สามารถทำงานได้:
select name
from master.sys.databases
where owner_sid > 1;
และแสดงเฉพาะฐานข้อมูลที่สร้างโดยผู้ใช้
owner_sid=1
หมายถึงsa
เจ้าของไม่มีอะไรพิเศษเกี่ยวกับมัน
คุณสามารถค้นหาชื่อฐานข้อมูลทั้งหมดได้: -
select name from sys.sysdatabases
ในการแยกฐานข้อมูลระบบ:
SELECT name FROM master.dbo.sysdatabases where sid <>0x01
sid
คอลัมน์อยู่บนsys.databases
โต๊ะowner_sid