掌握系統預存程序與目錄檢視可大幅提升資料庫探索與自動化開發效率。本文整理常用的中繼資料查詢技巧,涵蓋資料庫、資料表、欄位、預存程序與 ADO.NET 參數發現。
-- 所有資料庫名稱、大小、備註
EXEC sp_databases;
-- 或查詢目錄檢視 (SQL 2005+ 推薦)
SELECT name, database_id, create_date, state_desc FROM sys.databases;
USE Northwind; GO
EXEC sp_tables @table_type = "'TABLE'"; -- 只列 TABLE,排除 SYSTEM TABLE/VIEW
-- 現代寫法
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';
EXEC sp_columns 'Orders'; -- 傳回欄位名、型別、長度、精度、Identity、Nullable 等
-- 現代寫法 (資訊更豐富)
SELECT
COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION, NUMERIC_SCALE, IS_NULLABLE,
COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA+'.'+TABLE_NAME), COLUMN_NAME, 'IsIdentity') AS IsIdentity
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Orders';
-- 老寫法
SELECT * FROM sysobjects WHERE type = 'P' AND category = 0; -- category=0 排除系統程序
-- 推薦:INFORMATION_SCHEMA
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE';
-- 或 sys.procedures (SQL 2005+)
SELECT name, create_date, modify_date FROM sys.procedures;
利用 SqlCommandBuilder.DeriveParameters 自動填入參數集合,適用於通用執行器/程式碼產生器:
using (SqlConnection conn = new SqlConnection(connStr)) {
conn.Open();
using (SqlCommand cmd = new SqlCommand("SalesByCategory", conn)) {
cmd.CommandType = CommandType.StoredProcedure;
SqlCommandBuilder.DeriveParameters(cmd); // 需參考 System.Data.dll
foreach (SqlParameter p in cmd.Parameters) {
Console.WriteLine($"Name:{p.ParameterName}, Size:{p.Size}, Type:{p.DbType}, " +
$"Direction:{p.Direction}, IsNullable:{p.IsNullable}");
}
}
}
| 功能 | 指令/檢視 | 備註 |
|---|---|---|
| 目前資料庫所有檢視 | SELECT * FROM INFORMATION_SCHEMA.VIEWS | |
| 資料表索引定義 | EXEC sp_helpindex 'TableName' / sys.indexes | |
| 外鍵關聯 | EXEC sp_fkeys 'TableName' / INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS | |
| 資料表空間使用量 | EXEC sp_spaceused 'TableName' | 含資料列數、保留/資料/索引/未使用空間 |
| 相依物件追蹤 | EXEC sp_depends 'ObjectName' / sys.sql_expression_dependencies | 找出誰參考此物件、此物件參考誰 |
| 目前執行中的查詢 | sp_who2 / sys.dm_exec_requests | SQL 2005+ 建議用 DMV |
OBJECT_ID(), COLUMNPROPERTY(), INDEXPROPERTY() 等中繼資料函數:撰寫動態 SQL 時極為方便。