设为首页收藏本站我的广告

运维网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
运维网 首页 数据库运维 SQL Server 查看内容

SQL 格式化工具 V.1

2012-4-27 13:37| 发布者: yunweiw.com| 查看: 837| 评论: 0|原作者: 运维网|来自: 网络

  最近在做公司的查询平台,要抓以前旧的SQL语句。用VS抓出来的语句经常是一些没有分段的一连串的SQL,复制到SQL SERVER 2008后还要自己分段,相当麻烦。于是就有了写一个简单的SQL格式化工具的想法。

  我的实现思路很简单:1 设置一个SQL语句每一段的长度值,超过这个长度值的时候就给他增加一个分段符。

  代码:view plainprint?

  public partial class Form1 : Form { //用于标记切割时的开始位置int stratNum=0;string temp;//设置格式化后每一段SQL语句的长度值int length = 40;StringBuilder sb;public Form1()

  { InitializeComponent();}

  private void btnFormat_Click(object sender, EventArgs e)

  { try { //字符长度label1.Text = Convert.ToString(tbSourceSql.Text.Length);sb = new StringBuilder();while (stratNum <= (tbSourceSql.Text.Length))

  { //判断是否到最后一行if ((tbSourceSql.Text.Length - stratNum) > length)

  { //判断结尾是否为空字符串或标点temp = tbSourceSql.Text.Substring(stratNum, length);// 如果不是以“ ”或“,”结尾,则重新截取while(!(temp.EndsWith(" ") || temp.EndsWith(",")))

  { length++;temp = tbSourceSql.Text.Substring(stratNum, length);} stratNum += length;} else { temp = tbSourceSql.Text.Substring(stratNum);stratNum += length;} sb.Append(temp + Environment.NewLine);} tbFormatSql.Text = sb.ToString();MessageBox.Show("Format Success.");} catch (Exception ex)

  { throw new Exception(ex.Message);} finally { stratNum = 0;sb = null;}

  }实现语句相当简单,但好像效果不是很好。因为有些会行会超出设置的长度。以后再细查原因。

  效果:需要分割的SQL语句:view plainprint?

  SELECT distinct PLActorRight.*,PLMenuItem.PLMenuName,PLMenuItem.PLMenuStep,PLMenuItem.PLMenuValue,PLMenuItem.PLSystemID,PLMenuItem.PLAssemblyName,PLMenuItem.PLClassName,PLActorIDSystemID=PLMenuItem.PLSystemID*100000 + PLActorRight.PLActorID FROM PLActorRight LEFT JOIN PLMenuItem ON PLMenuItem.PLMenuID=PLActorRight.PLMenuID WHERE PLActorID IN (SELECT PLActorID FROM PLUserActor WHERE <> AND PLActorRight.PLEnabledFlag=1 AND PLActorRight.PLShowFlag=1)

  格式化后效果图:

  2 设置几个SQL的关键字。遇到关键字就分段。

  代码:view plainprint?

  public partial class Form1 : Form { //分割字段string[] keyString = new string[] { "FROM", "LEFT JOIN", "RIGHT JOIN", "INNER JOIN", "ORDER BY", "GROUP BY", "SELECT", "UNION ALL" };public Form1()

  { InitializeComponent();} ///

/// 给关键字加分割符/// /// /// private string[] GetNewString(string[] oldString)

  { string[] newString = new string[oldString.Length];for (int i = 0; i < newString.Length; i++)

  { newString[i] +=oldString[i]+ Environment.NewLine;} return newString;}

  private void btnFormat2_Click(object sender, EventArgs e)

  { string sourceSql = this.tbSourceSql.Text;string reString= ReplaceStrings(sourceSql, keyString, GetNewString(keyString));this.tbFormatSql.Text = reString.ToString();}

  private string ReplaceStrings(string str,string[] oldStrings,string[] newStrings)

  { //Length取数据长度较短的那个string reString = string.Empty;

  int length = oldStrings.Length > newStrings.Length ? newStrings.Length : oldStrings.Length;for (int i = 0; i < length; i++)

  { string tempString = string.Empty;//替换tempString = str.Replace(oldStrings[i], newStrings[i]);str = tempString;} return str;}

  同样的原SQL代码,分割后效果图:

  两个都是很粗略的方法,要想做出格式很好的SQL语句,还有很多要做。比如方法2中最好加一个长度限定,要了一定长度后自动分割。以及自动维护分割的关键字等。

下一篇:SQL2008删除所有数据表脚本

上一篇:SQL Server查看所有表大小,所占空間


鲜花

握手

雷人

路过

鸡蛋
加入阿里云推荐返利15%

最新评论

QQ|申请友链|sitemap|手机版|小黑屋|Archiver|运维网 ( 京ICP备16008201号  

GMT+8, 2016-12-9 21:34 , Processed in 0.062446 second(s), 28 queries , Xcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

返回顶部