取得所有資料庫名稱 (含系統資料庫)
-- 方法 1:系統目錄檢視 (SQL 2000 相容)
SELECT name FROM master.dbo.sysdatabases;
-- 方法 2:系統函數 (SQL 2005+)
SELECT name FROM sys.databases;
取得所有使用者資料庫名稱 (排除系統資料庫)
-- SQL 2000:系統資料庫 dbid <= 6 (master, tempdb, model, msdb, Northwind, pubs)
SELECT [name] FROM master.dbo.sysdatabases WHERE dbid > 6 ORDER BY [name];
-- SQL 2005+:排除系統資料庫
SELECT name FROM sys.databases WHERE database_id > 4 ORDER BY name;
取得資料庫完整資訊 (含檔案路徑、大小、建立日期等)
-- SQL 2000
SELECT * FROM master.dbo.sysdatabases WHERE dbid > 6 ORDER BY [name];
-- SQL 2005+:更豐富的中繼資料
SELECT
d.name AS DatabaseName,
d.database_id,
d.create_date,
d.compatibility_level,
d.collation_name,
d.state_desc,
mf.name AS LogicalName,
mf.physical_name AS FilePath,
mf.size * 8 / 1024.0 AS SizeMB,
mf.type_desc AS FileType
FROM sys.databases d
JOIN sys.master_files mf ON d.database_id = mf.database_id
WHERE d.database_id > 4
ORDER BY d.name, mf.type_desc;
進階:動態切換資料庫內容執行查詢
DECLARE @sql NVARCHAR(MAX) = '';
SELECT @sql += 'USE [' + name + ']; SELECT DB_NAME() AS CurrentDB, COUNT(*) AS TableCount FROM sysobjects WHERE xtype=''U''; '
FROM master.dbo.sysdatabases WHERE dbid > 6;
EXEC sp_executesql @sql;
注意事項
sysdatabases 為相容性檢視,新專案建議使用 sys.databases。
- 系統資料庫 ID 可能因安裝元件不同而異動,建議以名稱排除:
WHERE name NOT IN ('master','tempdb','model','msdb')。
- 查詢檔案路徑需足夠權限 (VIEW SERVER STATE 或 sysadmin)。