首頁 考試吧論壇 Exam8視線 考試商城 網絡課程 模擬考試 考友錄 實用文檔 求職招聘 論文下載 | ||
![]() |
2011中考 | 2011高考 | 2012考研 | 考研培訓 | 在職研 | 自學考試 | 成人高考 | 法律碩士 | MBA考試 MPA考試 | 中科院 |
|
![]() |
四六級 | 職稱英語 | 商務英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT 新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學習 | 法語 | 德語 | 韓語 |
|
![]() |
計算機等級考試 | 軟件水平考試 | 職稱計算機 | 微軟認證 | 思科認證 | Oracle認證 | Linux認證 華為認證 | Java認證 |
|
![]() |
公務員 | 報關員 | 銀行從業資格 | 證券從業資格 | 期貨從業資格 | 司法考試 | 法律顧問 | 導游資格 報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師 人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業資格 | 廣告師職業水平 駕駛員 | 網絡編輯 |
|
![]() |
衛生資格 | 執業醫師 | 執業藥師 | 執業護士 | |
![]() |
會計從業資格考試(會計證) | 經濟師 | 會計職稱 | 注冊會計師 | 審計師 | 注冊稅務師 注冊資產評估師 | 高級會計師 | ACCA | 統計師 | 精算師 | 理財規劃師 | 國際內審師 |
|
![]() |
一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監理工程師 | 安全工程師 質量工程師 | 物業管理師 | 招標師 | 結構工程師 | 建筑師 | 房地產估價師 | 土地估價師 | 巖土師 設備監理師 | 房地產經紀人 | 投資項目管理師 | 土地登記代理人 | 環境影響評價師 | 環保工程師 城市規劃師 | 公路監理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計量師 |
|
![]() |
繽紛校園 | 實用文檔 | 英語學習 | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲 |
需求
現在數據庫很老很大,表不多,200來個,但數據量很大:最大的數據表2億6千萬條,每天增加50多w,925個存儲過程。
系統大,耦合度很高,牽一發而動全身。人員變動頻繁,接手的人員要在修改之前,就得花相當長的時間來分析關聯性。
所以,印度資深系統分析員要求我在一個EXCEL文件中,把925個存儲過程的所有依賴的對象(表、函數、視圖、存儲過程等等)都列舉出來。
分析
手工逐個打開存儲過程去做,對寫軟件的人來說是很傻的事情,一般重復性工作,如果預計耗時超過3分鐘,我就會卷起袖子寫個代碼。
工作內容有3部分:
1.獲取所有的存儲過程。我們可以用sysobjects這個系統表,它存儲了所有的表、存儲過程、視圖、函數等。其中存儲過程的xtype是P。另外說一下,如果是CLR存儲過程,類型是PC。
2. 獲取某存儲過程所依賴的對象,當然是先google了。很久之前我就知道可以用系統存儲過程sp_depends來獲取,不過還是應該看看還有什么更好的辦法。首先我發現這個:http://www.mssqltips.com/tip.asp?tip=1294 。作者研究出4種辦法:INFORMATION_SCHEMA.ROUTINES/sp_depends/syscomments/sp_MSdependencies。其中就有我一直在用的sp_depends。其它辦法有的霸王硬上弓:用charindex來遍歷存儲過程內容,或者用LIKE來判斷。。。。。我服了,寫代碼的風格千差萬別,一些是[Foo],一些是Foo,而且不同的存儲過程名稱可能存在完全給另外一個包含,譬如Foo Foo1 AFoo等。
看完之后,我還是覺得使用sp_depends相對靠譜。為什么說“相對靠譜”呢?因為我發現它某些情況下也會沒有返回所有依賴的,這應該是SQL Server的bug吧?如果要把所有依賴都找回來,你可以去修改被遺忘的引用存儲過程,隨便加個空行,運行(就是保存結果),你會發現之前沒有顯示的依賴終于出現了。而且,sp_depends會輸出重復的記錄。。。所以我們在代碼中要剔除掉。
3. 既然是輸出到EXCEL文件,我們就需要找相應的代碼。在這個網站已經有很多EXCEL文件生成的代碼了,譬如NPOI。我最后采用了GemBox的,因為夠輕便。本來想用更輕便的MyXLS,但發現它不支持單背景色。當然你也可以用別的,譬如XML格式的EXCEL文件,這是你個人的選擇了。
解決了上述的2個問題,我們就可以大干一場了。我還是采用VS2005+C#2.0,因為公司還是在用古老的XP搭配VS2005,鬼佬國家要求什么都正版,自然不會像我們在中國那樣隨便就升級到2010了。所以只能放棄LINQ,老老實實地寫冗余的代碼了。
以下代碼沒有什么特別的,都是循環所有存儲過程,然后循環每個存儲過程的依賴對象,然后排序輸出(先按照類型,然后按照名稱)。代碼也寫得很quick and dirty,10來分鐘的事情,不要跟代碼規范較真。
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Drawing;
using System.Data;
using System.Data.SqlClient;
using GemBox.Spreadsheet;
namespace SQLServerDocumenter
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
{
args = new string[3];
args[0] = "FooDB";
args[1] = "FooServer";
args[2] = "FooPassword";
}
string db = args[0];
string dataSource = args.Length > 1 ? args[1] : string.Empty;
string password = args.Length > 2 ? args[2] : string.Empty;
ExcelFile xls = new ExcelFile();
ExcelWorksheet sheet = xls.Worksheets.Add("Dictionary");
CellStyle typeStyle = new CellStyle(xls);
typeStyle.FillPattern.SetSolid(Color.Yellow);
typeStyle.Font.Color = Color.Black;
typeStyle.Font.Weight = ExcelFont.BoldWeight;
CellStyle nameStyle = new CellStyle(xls);
nameStyle.FillPattern.SetSolid(Color.DarkGray);
nameStyle.Font.Color = Color.Black;
nameStyle.Font.Weight = ExcelFont.BoldWeight;
CellStyle itemStyle = new CellStyle(xls);
itemStyle.FillPattern.SetSolid(Color.LightGray);
itemStyle.Font.Color = Color.Black;
itemStyle.Font.Weight = ExcelFont.BoldWeight;
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |