必胜高考网_全国高考备考和志愿填报信息平台

必勝高考網 > 計算機類 > 計算機等級 > 資訊 >

自動輸出SQLServer存儲過程依賴列表到EXCEL文件

時間: 家輝2 資訊
 為大家更好的備考全國計算機等級考試,現學習啦小編專門準備了計算機三級《數據庫技術》考前復習重點:自動輸出SQLServer存儲過程依賴列表到EXCEL文件,希望可以幫到你!
需求

  手工逐個打開存儲過程去做,對寫軟件的人來說是很傻的事情,一般重復性工作,如果預計耗時超過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;

  sheet.Cells[0, 0].Value = string.Format("{0} database dictionary", db);

  sheet.Cells[4, 0].Value = "Name";

  sheet.Cells[4, 0].Style = nameStyle;

  sheet.Cells[4, 1].Value = "Dependencies";

  sheet.Cells[4, 1].Style = nameStyle;

  sheet.Cells[4, 2].Value = "Type";

  sheet.Cells[4, 2].Style = nameStyle;

  string connectionString = string.Format("Password={0};Persist Security Info=True;User ID=sa;Initial Catalog={1};Data Source={2}", password, db, dataSource);

  using (SqlConnection connection = new SqlConnection(connectionString))

  {

  connection.Open();

  sheet.Cells[5, 0].Value = "Stored Procedures";

  sheet.Cells[5, 0].Style = typeStyle;

  DataSet data = new DataSet();

  using (SqlCommand command = new SqlCommand("SELECT * FROM sysobjects WHERE XTYPE='p' ORDER BY NAME", connection))

  {

  SqlDataAdapter adapter = new SqlDataAdapter(command);

  adapter.Fill(data);

  DataTable objects = data.Tables[0];

  int index = 6;

  for (int i = 0; i < objects.Rows.Count; i++)

  {

  string objectName = objects.Rows[i]["name"].ToString();

  sheet.Cells[index, 0].Value = objectName;

  sheet.Cells[index, 0].Style = itemStyle;

  DataSet data2 = new DataSet();

  using (SqlCommand command2 = new SqlCommand(string.Format("exec sp_depends '{0}'", objectName), connection))

  {

  adapter = new SqlDataAdapter(command2);

  adapter.Fill(data2);

  }

  if (data2.Tables.Count > 0)

  {

  DataTable dependencies = data2.Tables[0];

  Dictionary> uniqueDependencies = new Dictionary>();

  for (int j = 0; j < dependencies.Rows.Count; j++)

  {

  string itemName = dependencies.Rows[j]["name"].ToString();

  if (!uniqueDependencies.ContainsKey(itemName))

  uniqueDependencies.Add(itemName, new KeyValuePair(itemName, dependencies.Rows[j]["type"].ToString()));

  }

  List> allItems = new List>();

  foreach (KeyValuePair> item in uniqueDependencies)

  {

  allItems.Add(new KeyValuePair(item.Value.Key, item.Value.Value));

  }

  allItems.Sort(new KVPComparer());

  foreach (KeyValuePair item in allItems)

  {

  index++;

  sheet.Cells[index, 1].Value = item.Key;

  sheet.Cells[index, 2].Value = item.Value;

  }

  }

  else

  {

  index++;

  sheet.Cells[index, 1].Value = "(N/A)";

  }

  index += 3;

  Console.WriteLine(string.Format("({0}/{1}) {2} done", i + 1, objects.Rows.Count, objectName));

  }

  }

  connection.Close();

  }

  string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\" + db + ".xls";

  xls.SaveXls(path);

  Console.WriteLine();

  Console.WriteLine("all done!");

  Console.Read();

  }

  }

  internal class KVPComparer : IComparer>

  {

  public int Compare(KeyValuePair x, KeyValuePair y)

  {

  int compare = string.Compare(x.Value, y.Value);

  if (compare == 0)

  return string.Compare(x.Key, y.Key);

  else

  return compare;

  }

  }

  }

  使用

  使用很簡單,編譯(你得找個EXCEL輸出代碼。。。),在命令行(改成Win應用也可以啊)輸入3個參數:數據庫名、服務器名和密碼。當然,大家都有自己的品味,喜歡怎么改輸出格式就怎么改吧。

  結論

  印度資深系統分析員只是讓我給個EXCEL文件,沒有讓我寫代碼,所以把我自己的研究成果發上來也無傷大雅。一般我都喜歡把寫的東西弄成可重用的,不僅僅為了一個固定的目的,所以也便有了3個參數。

  最后輸出的的EXCEL文件有6000多行。

56094 主站蜘蛛池模板: 扬尘监测_扬尘监测系统_带证扬尘监测设备 - 郑州港迪科技有限公司 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 糖衣机,除尘式糖衣机,全自动糖衣机,泰州市长江制药机械有限公司 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 污水提升器,污水提升泵,地下室排水,增压泵,雨水泵,智能供排水控制器-上海智流泵业有限公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | 拖链电缆_柔性电缆_伺服电缆_坦克链电缆-深圳市顺电工业电缆有限公司 | 德州网站制作 - 网站建设设计 - seo排名优化 -「两山建站」 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 江苏密集柜_电动_手动_移动_盛隆柜业江苏档案密集柜厂家 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 大数据营销公司_舆情监测软件_上海SEO公司-文军营销官网 | 德州网站开发定制-小程序开发制作-APP软件开发-「两山开发」 | 一体化隔油提升设备-餐饮油水分离器-餐厨垃圾处理设备-隔油池-盐城金球环保产业发展有限公司 | 东莞画册设计_logo/vi设计_品牌包装设计 - 华略品牌设计公司 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 金属清洗剂,防锈油,切削液,磨削液-青岛朗力防锈材料有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 艺术漆十大品牌_艺术涂料加盟代理_蒙太奇艺术涂料厂家品牌|艺术漆|微水泥|硅藻泥|乳胶漆 | 河南中专学校|职高|技校招生-河南中职中专网 | 液氮罐_液氮容器_自增压液氮罐-北京君方科仪科技发展有限公司 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | Honsberg流量计-Greisinger真空表-气压计-上海欧臻机电设备有限公司 | 安规_综合测试仪,电器安全性能综合测试仪,低压母线槽安规综合测试仪-青岛合众电子有限公司 | 北京乾茂兴业科技发展有限公司| 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 微学堂-电动能源汽车评测_电动车性能分享网 | 手持式3d激光扫描仪-便携式三维立体扫描仪-北京福禄克斯 | 设定时间记录电子秤-自动累计储存电子秤-昆山巨天仪器设备有限公司 | 挤奶设备过滤纸,牛奶过滤纸,挤奶机过滤袋-济南蓝贝尔工贸有限公司 | 南溪在线-南溪招聘找工作、找房子、找对象,南溪综合生活信息门户! | 污水提升器,污水提升泵,污水提升装置-德国泽德(zehnder)水泵系统有限公司 |