SQL Server管理员不易养成的好习惯(附小工具)

一、开发初衷

相信大家在平时写SQL语句的时候,为了节省时间,都不太喜欢把小指放到Shift键上打出关键字的大写形式,比如建数据库,直接就create database…了,而不是CREATE DATABASE,反正SQL SERVER都可以执行语句,所以也就无所谓代码的效果了。

的确如此,但是编程都有规范一说,在SQL的编写中,将关键字大写就是一个规范,所以如果有这样的工具能够方便象我也是这样的懒人,批量将关键字替换成大写那就好了,不过饭来张口、衣来伸手可不是什么好习惯,所以还是DIY吧。。。

二、开发思路

建立Winform应用程序,依据需求此工具需要实现三个方面:

1、打开对话框——选择要处理的SQL文件路径;

2、保存对话框——选择处理完成后输出文件的路径;

3、核心功能——用正则表达式查找SQL文件中的关键字,如有匹配则将其转换为大写。

三、开发过程

俗话说:计划赶不上变化。本来计划一两个小时就能够搞定,但是还是足足折腾了一个下午,实在有些汗颜,下面就详细叙述一下过程吧:

1、搜集SQL关键字

要说SQL关键字,除了大家常见的CRUD相关的语句,还有FUNCTION、CURSOR、PROCEDURE、系统内置VARIABLE、VIEW、SCHEMA等等等等,总之一大堆,而且貌似也超出关键字的范畴了,要想完全搞定这么多东西,俺实在只能说无能为力了,所以我只搜集了大家平时经常用到的一些关键字,在下面的代码中会看到。

PS:当然如果园子里哪位能够做出一个覆盖所有SQL那样强大的来,小弟一定前往拜读。

2、SQL文件语句的遍历

不像ORACLE里的SQL PLUS那样难用的东西(主要是俺太菜了,经常出纰漏,很难一下就写对SQL),在SQL SERVER中SQL语句可以上下键随意更改内容或格式,而且语句也不用强制分号作为结尾,所以复杂的时候几行甚至十几行才是一个完整的SQL语句,所以一开始我就尝试从头到尾遍历整个文件貌似有些不太现实,最后的方案是采用了按行划分,以一行为一个数组进行处理,代码如下: 

  1. //先以行作为划分,得到一个数组  
  2.  Regex rowReg = new Regex("\r\n");  
  3.  string[] strRow = rowReg.Split("转换的SQL源文件内容"); 

3、现在依然不能急着处理strRow数组中的每一个元素,因为元素中有可能会出现”  create       database   “这样的情况,即关键字两侧有一个或多个空格字符,如果不进行统一处理,会给后面的替换带来很大的麻烦,所以这里再用一个正则表达式,使空格通通变成一个,随后再以空格作为分割符,这样才算得到了我们真正需要进行匹配替换操作的数组:

  1. for (int i = 0; i < strRow.Length; i++)  
  2.  {  
  3. strRow[i] = Regex.Replace(strRow[i], @"\s+"" ");  
  4. string[] strRowDetail = strRow[i].Split(new char['\0']);  

4、下面循环遍历strRowDetail数组中的每一项:

  1. for (int j = 0; j < strRowDetail.Length; j++)  
  2.  {  
  3.       if (regex.regRow.IsMatch(strRowDetail[j]))  
  4.       {  
  5.    Match match = regex.Match(strRowDetail[j]);  
  6.             ...  
  7.      }  
  8.  } 

 

为什么暂时省略了后面的代码呢,因为这样写考虑是不周全的,试想如果一个SQL语句如:

  1. create table student  
  2.  (  
  3.      cno varchar(50),  
  4.      ...  
  5.  ) 

这样关键字一个是一个的话,那匹配起来自然没有问题,但很多时候事情并没有那么简单,有些SQL语句包含了很多关键字。

最典型的就是日期类型的操作,比如:

  1. --求本月天数:select day(dateadd(mm,1,getdate())-day(getdate())); 

 

这样的一个SQL语句我们以空格划分后,那么数组的第二个元素会是day(dateadd(mm,1,getdate())-day(getdate())),如果进行上述的Match匹配就只会将第一个day变为大写,而其他则没有得到处理。

进行了一定的测试后,我转用了MatchCollection类,代码如下(注:tbSource指的是显示SQL代码的文本框):

  1. for (int j = 0; j < strRowDetail.Length; j++)  
  2. {  
  3.      //regex.regRow指的是寻找匹配关键字的正则表达式,在代码下载中会看到  
  4.    //首先查看strRowDetail[j]是否能够匹配  
  5.       if (regex.regRow.IsMatch(strRowDetail[j]))  
  6.      {   
  7.          //若能匹配则记录其匹配的内容   
  8.             MatchCollection mc = regex.regRow.Matches(strRowDetail[j]);   
  9.            //遍历匹配的集合  
  10.            for (int k = 0; k < mc.Count; k++)  
  11.         {  
  12.                //循环替换匹配的项  
  13. strRowDetail[j] = strRowDetail[j].Replace(               
  14. mc[k].Value, mc[k].Value.ToUpper());  
  15.            }  
  16.             //附加替换完成后的内容  
  17.              this.tbSource.Text += strRowDetail[j] + " ";  
  18.       }  
  19.        //不匹配则直接附加原来的内容  
  20.         else 
  21.        {  
  22.             this.tbSource.Text += strRowDetail[j] + " ";  
  23.        }  
  24.  }  
  25.   //因为最初是以行分割的,所以这里要附加\r\n,从而保持其原来的格式  
  26.   this.tbSource.Text += "\r\n"

 5、最后用StreamWriter将得到的内容写入文件,这里除了编码问题貌似也没啥好说的了:

  1. StreamWriter writer = new StreamWriter(this.tbExportPath.Text, false
  2. Encoding.Default);  
  3. writer.WriteLine(this.tbSource.Text);  
  4. writer.Flush(); 

四、效率测试

细心的你在阅读代码的过程中可能已经发现我在大量的字符串处理操作时一直在使用普通的字符串”+=”这样的方法,其实这也是我为我的效率小测验准备的,这下可以再切实的体会一下StringBuilder对效率的提升。

要测试那还是要请出我们的Stopwatch了,相信大家都会的了,下面的代码直接无视:

  1. StreamWriter writer = new StreamWriter(this.tbExportPath.Text, false,                                              Encoding.Default);  
  2. writer.WriteLine(this.tbSource.Text);  
  3. writer.Flush(); 

 

如果使用原来普通字符串连接的方法,足足等了我5347毫秒!

     而如果使用StringBuilder对象作字符串操作,并且为提高for循环效率,避免每次重复计算数组长度,先将数组的长度存储在变量中,优化代码如下:

  1. int strRowDetailLength = strRowDetail.Length;   
  2.  for (int j = 0; j < strRowDetailLength; j++)   
  3.  {   
  4.      if (regex.regRow.IsMatch(strRowDetail[j]))  
  5.      {   
  6.        MatchCollection mc = regex.regRow.Matches(strRowDetail[j]);   
  7.          int mcCount = mc.Count;  
  8.          for (int k = 0; k < mcCount; k++)   
  9.          {  
  10.     strRowDetail[j] = strRowDetail[j]                            
  11. .Replace(mc[k].Value, mc[k].Value.ToUpper());  
  12.          }  
  13.          strBuilder.Append(strRowDetail[j] + " ");  
  14.      }  
  15.    else15     {  
  16.    strBuilder.Append(strRowDetail[j] + " ");  
  17.       }  
  18. }  
  19. strBuilder.Append("\r\n"); 

测试的结果是34毫秒,hoho,StringBuilder的威力果然很强大。。。

五、项目说明

1、介于正则表达式实在是碍眼,所以就没有贴出来,说实话我自己都不忍心看了。。。

2、麻雀虽小也要五脏俱全嘛,这个小工具在界面上使用了钱李峰同学的 美化版Winform,没经作者同意就乱打广告,忘作者不要介意啊 ^_^

六、后续问题

1、希望大家在看完后能够指出我在解决的思路上有没有什么问题,有没有什么简单的方法,因为虽然实现了,但个人感觉方法上有点龊。。。

2、期待哪位能够开发出更完善更优雅的SQL关键字替换工具。。。

3、如有使用问题请及时留言。。。

七、项目下载

http://files.cnblogs.com/RockyMyx/Solution.rar

原文标题:DIY小工具开发—SQL关键字批量转换

链接:http://www.cnblogs.com/RockyMyx/archive/2010/04/21/Convert-Sql-Keyword.html

【编辑推荐】

  1. SQL Server使用索引实现数据访问优化
  2. SQL Server数据库优化经验总结
  3. 如何使用SQLServer数据库查询累计值
  4. 浅析Oracle和SqlServer存储过程的调试、出错处理
  5. 几段SQLServer语句和存储过程
  6. 50种方法优化SQL Server数据库查询

 

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/278193.html<

(0)
运维的头像运维
上一篇2025-05-11 11:36
下一篇 2025-05-11 11:37

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注