首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

自動化匯出 SQL Server 預存程序相依關係至 Excel (C# + GemBox.Spreadsheet)

     編輯:關於SqlServer

面對 925 支預存程序、2.6 億筆資料的龐大舊系統,人工梳理相依關係幾乎不可能。本文提供一套 C# 主控台程式,自動掃描所有預存程序,呼叫 sp_depends 取得相依物件 (資料表、檢視表、函數、預存程序),去重排序後輸出至 Excel,供團隊快速進行影響分析。

核心邏輯三步驟

  1. 取得所有預存程序:SELECT name FROM sysobjects WHERE xtype='P' ORDER BY name (CLR 預存程序 xtype='PC')
  2. 解析相依物件:執行 sp_depends 'proc_name',去除重複記錄 (sp_depends 會回傳重複行)
  3. 輸出 Excel:使用 GemBox.Spreadsheet (輕量、免 Office、支援 .xls/.xlsx),依類型/名稱排序寫入工作表

關鍵程式碼片段

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 偶爾會遺漏相依 (延遲更新),解法:對被遺漏的參考物件做無意義修改 (加空白行) → 執行 → 相依即出現
  • 大型資料庫執行時間約 10~20 分鐘,輸出 6000+ 列 Excel
  • 參數化設計:exe DB_Name Server_Name Password,可重複用於多環境
  • 若偏好 NPOI / EPPlus / ClosedXML,僅需替換 Excel 寫入部分

此工具已協助團隊快速掌握 925 支 SP 的完整相依圖譜,大幅縮短新人上手與變更影響分析時間。原始碼開放,歡迎依專案需求調整輸出格式 (加入欄位層級、呼叫深度等)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved