简书链接:sqlserver存储过程搜索代码探索研究 文章字数:643,阅读全文大约需要2分钟 心血来潮有想改进下工作效率,在代码开发过程中同事经常问这个错误是哪里触发的,这不是我写的我也只能一个一个调试定位到是哪个存储过程,而且 这存储过程的远程调试是很操蛋的基本上是失败的,对被远程端和远程端版本 以及相关服务等要求非常苛刻,(我另外开发了一个存储过程直接快速变成sql语句的vs code 插件),基本上很难打通的,这方面微软也没进行优化。
于是想到了我之前的存储过程显示源码的玩意,又进行了改进,直接搜索存储过程内容。 切换到要搜索的数据库
1 2 3 4 5 SELECT top 30 OBJECT_NAME(sm.object_id) AS ProcedureName, OBJECT_DEFINITION(sm.object_id) AS ProcedureDefinition,* FROM sys.sql_modules AS sm WHERE OBJECT_DEFINITION(sm.object_id) LIKE '%搜索的关键词%'
不过搜索后是一行显示,显然不行的,还需要开发一个工具,让他能完整显示每行,方便执行测试 于是整了个web版本
但是还是感觉不得劲,想开发zure data studio的扩展。 ,但是开发思路是不知道怎么在存储过程的右键菜单插入,于是在azure data studio的扩展中进行搜索 search 原来有人做了类似的工具,支持缓存搜索和 热连接接搜索 不过操作交互不太舒服,是快捷键弹出对话框,选中了一个结果其他结果就看不到了,还不如我网页版的方便。 另外此插件的功能介绍: 缓存模式建议在打算改代码的模式不要使用,否则可能导致生产事故。 快捷键ctrl+t是缓存模式 ctrl+shift+t 无缓存模式https://github.com/MikhailProfile/SearchEverywhere/issues
我的web版本实现逻辑也是很简单,因为用的 web core api,不打算套view,直接字符串拼接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 private static string FormatMultiResultAsHtml2(JArray arrs) { // 替换回车和换行符 //sql = sql.Replace("\r", "").Replace("\n", ""); // 构造 HTML 表格 string html = ""; for (int a = 0; a < arrs.Count; a++) { string title = arrs[a]["title"] +""; string contents = arrs[a]["content"]+""; int lineNum = 1; string linetag = "结果" + (a + 1); html += @" <div class=""result"" <h3> " +title+"|"+ HttpUtility.HtmlEncode(linetag) + @"</h3> <p onclick=""toggleDetails(this)"">展开/收缩</p> <div class=""result-details""> <code> "; html += contents.Replace("\n", "<br>"); //html += HttpUtility.HtmlEncode(contents.Replace("\n", "<br>")); html += @"</code> </div> </div>"; } string html1 = @" <!DOCTYPE html> <html lang=""en""> <head> <meta charset=""UTF-8""> <meta name=""viewport"" content=""width=device-width, initial-scale=1.0""> <style> .results-container { display: flex; flex-wrap: wrap; } .result { flex: 0 0 98%; margin: 2px; padding: 10px; border: 1px solid #ccc; cursor: pointer; } .result-details { display: none; } </style> </head> <body> <div class=""results-container""> " + html + @" </div> <script> function toggleDetails(element) { element = element.parentNode; var details = element.querySelector('.result-details'); if (details.style.display === 'none' || details.style.display === '') { details.style.display = 'block'; } else { details.style.display = 'none'; } } </script> </body> </html> "; return html1; }
然后
1 2 3 4 5 6 7 html = FormatMultiResultAsHtml2(ARR); html=html.Replace(content, "<font color='red'><b>" + content + "</b></font>"); } // 返回 HTML 响应 return Content(html, "text/html", Encoding.UTF8);
切换数据库问题,这个我尝试过似乎不能指定数据库只能直接切换数据库源了。 传递之前的连接字符串,然后进行修改设置回去。
1 2 3 4 string dbname = JSONUtil.getStringValue(obj, "dbname", "").returnvalue; SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(strConn); builder.InitialCatalog = dbname; strConn = builder.ToString();