SQL 格式化工具 V.1

本文介绍了一个简单的SQL格式化工具的实现思路与代码示例。该工具可通过设置每段SQL语句的长度值来自动进行换行,同时支持通过指定关键字进行换行处理。

最近在做公司的查询平台,要抓以前旧的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中最好加一个长度限定,要了一定长度后自动分割。以及自动维护分割的关键字等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值