需求:找出資料庫中所有擁有「醫院編號」欄位的資料表,或同時擁有「醫院編號」與「科室編號」的資料表。利用系統表 sysobjects 與 syscolumns 即可秒級完成。
SELECT a.name AS TableName
FROM sysobjects a
JOIN (
SELECT id
FROM syscolumns
WHERE name = 'HospitalID' -- 目標欄位名
GROUP BY id
) b ON a.id = b.id
WHERE a.xtype = 'U' -- 僅使用者資料表
ORDER BY a.name;
SELECT a.name AS TableName
FROM sysobjects a
JOIN (
SELECT id
FROM syscolumns
WHERE name IN ('HospitalID', 'DeptID')
GROUP BY id
HAVING COUNT(*) = 2 -- 兩個欄位都要有
) b ON a.id = b.id
WHERE a.xtype = 'U'
ORDER BY a.name;
系統表已過時,建議改用目錄檢視:
-- 單欄位
SELECT OBJECT_NAME(object_id) AS TableName
FROM sys.columns
WHERE name = 'HospitalID'
ORDER BY TableName;
-- 多欄位 AND
SELECT OBJECT_NAME(object_id) AS TableName
FROM sys.columns
WHERE name IN ('HospitalID', 'DeptID')
GROUP BY object_id
HAVING COUNT(*) = 2
ORDER BY TableName;
補充: 若需同時取得 Schema 名稱,可 JOIN sys.schemas ON schema_id;若要排除系統表,加上 AND OBJECTPROPERTY(object_id, 'IsMSShipped') = 0。