图片 3

如何写出易调试的SQL

瞩目:
本文存在SQL 注入的危害, 请用做调试意况, 最后消除格局见下意气风发篇
《写出易调节和测量检验的SQL(修改装订版)》

1.前言

对照高等语言的调治如C# , 调节和测验SQL是件痛楚的事 .
非常是这个上千行的积累进度, 更是大家码农的恶梦.

在将上千行存款和储蓄进度的SQL 分解到 C# 管理后, 也设有调节和测量试验的不流畅,
怎么着让调度流畅些吧, 请看后续

1.前言

2.遍布调节和测量检验

 2.1 平常在Dapper 里面贰个断点下去, 抓到相近如下SQL:

SELECT 
 a.* 
FROM  dbo.ptype a
INNER JOIN dbo.PType_Price b ON a.typeId=b.PTypeID
LEFT JOIN dbo.PType_Units c ON a.typeId=c.UnitsId
WHERE a.typeId=@typeid AND a.CreateDate=@Area 
 AND preprice1=@preprice1 AND deleted=@deleted

各类@符号, 须求手工替换后技能调解(麻烦), 即便能抓到最后SQL就好了

2.2 庆幸的是能够透过SQLServer Profiler 来抓到最后SQL

图片 1

而是坐褥条件中的SQLServer,  并发试行的SQL 比较多, 如上海体育场所所见,
在一大堆SQL 里面找到您刚刚推行的SQL也正如费心, 纵然能够Ctrl + F
调出寻找框来索求, 也要想个好的入眼字来找寻 , 麻烦. 

比较之下高等语言的调试如C# , 调节和测量检验SQL是件难熬的事 .
极度是那几个上千行的存款和储蓄进程, 更是大家码农的恶梦.

3.实施方案

 既然大家想要最终的SQL , 为毛不在丢给Dapper 推行前, 就已经是终极SQL了啊,
上中国人民解放军海军事工业程大学业具代码:

 

public class SqlHelper
    {

        public Dictionary<string, object> Param = new Dictionary<string, object>();

        public string ReplaceParam(ref string sql)
        {
            if (Param.Count == 0)
            {
                return sql;
            }

            StringBuilder sb = new StringBuilder();
            sb.Append(sql);
            foreach (var item in Param)
            {
                var paramName = item.Key;
                var paramValue = item.Value;
                var type = paramValue.GetType();
                if (type == typeof(string) || type == typeof(DateTime))
                {
                    //字符串
                    sb.Replace($"@{paramName}", $"'{paramValue}'");
                }
                else if (type == typeof(bool))
                {
                    //bool 类型
                    if (paramValue.ToString() == "True")
                    {

                        sb.Replace($"@{paramName}", "1");
                    }
                    else
                    {
                        sb.Replace($"@{paramName}", "0");
                    }
                }
                else
                {
                    //数值
                    sb.Replace($"@{paramName}", paramValue.ToString());
                }
            }

            sql = sb.ToString();
            return sql;
        }
    }

 

调用示例:

public IEnumerable<Ptype> GetPtypeDetail()
        {
            var sql = @"
SELECT a.* 
FROM  dbo.ptype a
INNER JOIN dbo.PType_Price b ON a.typeId=b.PTypeID
LEFT JOIN dbo.PType_Units c ON a.typeId=c.UnitsId
WHERE a.typeId=@Typeid AND a.CreateDate=@CreateDate 
AND preprice1=@preprice1 AND deleted=@deleted

";
            var sqlHelper = new SqlHelper();

            sqlHelper.Param.Add("Typeid", "001");
            sqlHelper.Param.Add("CreateDate", DateTime.Now);
            sqlHelper.Param.Add("preprice1", 3.62M);
            sqlHelper.Param.Add("deleted", true);
            sqlHelper.ReplaceParam(ref sql);

            IEnumerable<Ptype> plist = new List<Ptype>();
            using (var con = SQLServerHelper.GetConnection())
            {
                plist = con.Query<Ptype>(sql);
            }

            return plist;
        }

那般丢给Dapper 施行的SQL 始终是最终SQL, 就不要费尽脑筋去抓了.

PS: 有人大概会思疑那样替换的效率,不用担忧已测量检验 ,
C#的字符串替换是那么些快的, 下面的调用实例, 那个时候的测量试验结果是
微妙和皮秒等第, 有意思味的招呼能够再测量检验. 

在将上千行存款和储蓄进度的SQL 分解到 C# 管理后, 也存在调节和测量试验的不畅通,
怎样让调整流畅些呢, 请看后续

4. 最后

现行丢给Dapper试行的不再是 充满@参数的SQL ,  而是二个更替好的终极SQL . 

如此那般当COO隔老远吼道你说: 小蒋, 你tm 有个XX bug ,赶紧看看 .

您能够从容的在 Dapper
Query处打个断点图片 2 

鼠标放在SQL变量上, 轻易的得到最终SQL进行调治将养, 并不是, 手动去替换@参数,
又或则在SQLServer Profiler 里面铁树开花了!!!

 

作者: 蒋奎

博客: 

接待转发,请在显而易见地方给出出处及链接

2.广阔调节和测验

2.1 日常在Dapper 里面一个断点下去, 抓到相似如下SQL:

SELECT  a.*  FROM  dbo.ptype a  INNER JOIN dbo.PType_Price b ON a.typeId=b.PTypeID  LEFT JOIN dbo.PType_Units c ON a.typeId=c.UnitsId  WHERE a.typeId=@typeid AND a.CreateDate=@Area  AND preprice1=@preprice1 AND deleted=@deleted  

种种@符号, 须求手工业替换后技巧调治(麻烦), 假如能抓到最终SQL就好了

2.2 庆幸的是能够经过SQLServer Profiler 来抓到最终SQL

图片 3

可是生产情状中的SQLServer, 并发试行的SQL 相当多, 如上海教室所见, 在一大堆SQL
里面找到你刚才试行的SQL也正如麻烦, 即便能够Ctrl + F 调出寻找框来搜寻,
也要想个好的关键字来搜索 , 麻烦.

3.减轻方案

既然如此大家想要最后的SQL , 为毛不在丢给Dapper 实践前, 就已然是最后SQL了啊,
上中国人民解放军海军事工业程大学业具代码: