专栏名称: 数据分析与开发
伯乐在线旗下账号,分享数据库相关技术文章、教程和工具,另外还包括数据库相关的工作。偶尔也谈谈程序员人生 :)
目录
相关文章推荐
非法加冯  ·  对比Oracle与PostgreSQL事务系统 ·  昨天  
Alibaba Cloud International  ·  刷新世界纪录!阿里云PolarDB凭借创新的 ... ·  2 天前  
Alibaba Cloud International  ·  刷新世界纪录!阿里云PolarDB凭借创新的 ... ·  2 天前  
数据中心运维管理  ·  能源行业加大力度解决数据中心电力短缺问题 ·  2 天前  
数据中心运维管理  ·  到2029年,数据中心资本支出将超过1万亿美元 ·  1 周前  
数据中心运维管理  ·  机房工程数据中心安装施工工程工艺手册 ·  3 天前  
51好读  ›  专栏  ›  数据分析与开发

写出易调试的 SQL

数据分析与开发  · 公众号  · 数据库  · 2017-01-03 20:55

正文

(点击 上方公众号 ,可快速关注)


来源:蒋奎

链接: www.cnblogs.com/anuo/p/6241557.html

如有好文章投稿,请点击 → 这里了解详情


1.前言


相比高级语言的调试如C# , 调试SQL是件痛苦的事 . 特别是那些上千行的存储过程, 更是我等码农的噩梦.


在将上千行存储过程的SQL 分解到 C# 管理后, 也存在调试的不通畅, 如何让调试流畅些呢, 请看后续


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



但是生产环境中的SQLServer,  并发执行的SQL 非常多, 如上图所见, 在一大堆SQL 里面找到你刚才执行的SQL也比较麻烦, 即使可以Ctrl + F 调出搜索框来搜索, 也要想个好的关键字来搜索 , 麻烦.


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







请到「今天看啥」查看全文