面對 925 支預存程序、2.6 億筆資料的龐大舊系統,人工梳理相依關係幾乎不可能。本文提供一套 C# 主控台程式,自動掃描所有預存程序,呼叫 sp_depends 取得相依物件 (資料表、檢視表、函數、預存程序),去重排序後輸出至 Excel,供團隊快速進行影響分析。
SELECT name FROM sysobjects WHERE xtype='P' ORDER BY name (CLR 預存程序 xtype='PC')sp_depends 'proc_name',去除重複記錄 (sp_depends 會回傳重複行)using GemBox.Spreadsheet;
using System.Data.SqlClient;
var xls = new ExcelFile();
var ws = xls.Worksheets.Add("Dictionary");
// 樣式定義...
ws.Cells[0,0].Value = $"{dbName} database dictionary";
string connStr = $"Password={pwd};User ID=sa;Initial Catalog={db};Data Source={server}";
using (var conn = new SqlConnection(connStr))
{
conn.Open();
// 取得所有 SP
var dtSP = new DataTable();
new SqlDataAdapter("SELECT name FROM sysobjects WHERE xtype='P' ORDER BY name", conn).Fill(dtSP);
int row = 5; // 資料起始列
foreach (DataRow drSP in dtSP.Rows)
{
string spName = drSP["name"].ToString();
ws.Cells[row, 0].Value = spName; // SP 名稱
row++;
// 呼叫 sp_depends
var dtDep = new DataTable();
new SqlDataAdapter($"EXEC sp_depends '{spName}'", conn).Fill(dtDep);
// 去重:以物件名稱為 Key
var unique = new Dictionary>();
foreach (DataRow drDep in dtDep.Rows)
{
string depName = drDep["name"].ToString();
if (!unique.ContainsKey(depName))
unique[depName] = new KeyValuePair(depName, drDep["type"].ToString());
}
// 排序:先依類型,再依名稱
var sorted = unique.Values.OrderBy(kv => kv.Value).ThenBy(kv => kv.Key).ToList();
foreach (var kv in sorted)
{
ws.Cells[row, 1].Value = kv.Key; // 相依物件名稱
ws.Cells[row, 2].Value = kv.Value; // 類型
row++;
}
row += 2; // 群組間留白
}
xls.SaveXls($"{dbName}.xls");
}
sp_depends 偶爾會遺漏相依 (延遲更新),解法:對被遺漏的參考物件做無意義修改 (加空白行) → 執行 → 相依即出現exe DB_Name Server_Name Password,可重複用於多環境此工具已協助團隊快速掌握 925 支 SP 的完整相依圖譜,大幅縮短新人上手與變更影響分析時間。原始碼開放,歡迎依專案需求調整輸出格式 (加入欄位層級、呼叫深度等)。