SQL 格式化工具 V.1

来源:互联网 发布:杭州算法工程师招聘 编辑:程序博客网 时间:2024/05/23 21:01

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

我的实现思路很简单:

1 设置一个SQL语句每一段的长度值,超过这个长度值的时候就给他增加一个分段符。

代码:

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语句:

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 <<PLUserID ={0}>> AND PLActorRight.PLEnabledFlag=1 AND PLActorRight.PLShowFlag=1)

格式化后效果图:

 

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

代码:

 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();        }        /// <summary>        /// 给关键字加分割符        /// </summary>        /// <param name="oldString"></param>        /// <returns></returns>        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中最好加一个长度限定,要了一定长度后自动分割。以及自动维护分割的关键字等。

原创粉丝点击