关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »SQL Server管理员不易养成的好习惯(附小工具)

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

    2010-04-22 09:43:00 出处:ITJS
    分享

    一、开发初衷

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

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

    二、开发思路

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

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

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

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

    三、开发过程

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

    1、搜集SQL关键字

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

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

    2、SQL文件语句的遍历

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

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

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

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

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

    for (int j = 0; j < strRowDetail.Length; j++)   {        if (regex.regRow.IsMatch(strRowDetail[j]))        {     Match match = regex.Match(strRowDetail[j]);              ...       }   }   

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

    create table student   (       cno varchar(50),       ...   ) 

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

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

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

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

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

    for (int j = 0; j < strRowDetail.Length; j++)  {       //regex.regRow指的是寻找匹配关键字的正则表达式,在代码下载中会看到     //首先查看strRowDetail[j]是否能够匹配        if (regex.regRow.IsMatch(strRowDetail[j]))       {            //若能匹配则记录其匹配的内容               MatchCollection mc = regex.regRow.Matches(strRowDetail[j]);              //遍历匹配的集合             for (int k = 0; k < mc.Count; k++)          {                 //循环替换匹配的项  strRowDetail[j] = strRowDetail[j].Replace(               mc[k].Value, mc[k].Value.ToUpper());             }              //附加替换完成后的内容               this.tbSource.Text += strRowDetail[j] + " ";        }         //不匹配则直接附加原来的内容          else        {              this.tbSource.Text += strRowDetail[j] + " ";         }   }    //因为最初是以行分割的,所以这里要附加rn,从而保持其原来的格式    this.tbSource.Text += "rn"; 

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

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

    四、效率测试

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

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

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

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

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

    int strRowDetailLength = strRowDetail.Length;    for (int j = 0; j < strRowDetailLength; j++)    {        if (regex.regRow.IsMatch(strRowDetail[j]))       {          MatchCollection mc = regex.regRow.Matches(strRowDetail[j]);            int mcCount = mc.Count;           for (int k = 0; k < mcCount; k++)            {      strRowDetail[j] = strRowDetail[j]                            .Replace(mc[k].Value, mc[k].Value.ToUpper());           }           strBuilder.Append(strRowDetail[j] + " ");       }     else15     {     strBuilder.Append(strRowDetail[j] + " ");        }  }  strBuilder.Append("rn"); 

    测试的结果是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

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    微软已修复windows 7/windows 8.1媒体中心严重漏洞 用户可下载安

    卸载MySQL数据库,用rpm如何实现

    windows 7中使用网上银行或支付宝支付时总是打不开支付页面

    一致性哈希算法原理设计

    MySQL数字类型中的三种常用种类

    如何解决SQL Server中传入select语句in范围参数

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。