可视化查询(sp_helptext)——快速查询包含指定字符串的存储过程(附源码)
前言
在开发中,随着业务逻辑的调整,修改存储过程是必不可免的。
那怎么定位到需要修改的存储过程呢?一个一个的点开查询?存储过程少的话还行,一旦存储过程过多,这样是很浪费时间的,一个不注意还会遗漏掉。
在SqlServer中,我们可以使用 [1]sp_helptext 进行快速查询文本内容。
sp_helptext是显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。
sp_helptext获取存储过程内容的语法:
sp_helptext '存储过程名称'
那么我们怎么获取存储过程呢?是不是突然想到了什么?没错,就是查询系统对象表[2]sys.sysobjects,如下语法:
SELECT * FROM sys.sysobjects WHERE xtype='P'
到这里不熟悉的肯定有点懵了,xtype='P'是怎么来的,有什么依据,凭什么xtype=‘P’就是存储过程,不慌,下面说一下xtype有哪些值类型。
xtype对象类型(type 是为了与过去的版本相兼容而存在的,SQL Server7.0 之后用 xtype 就可以了):
| 类型值 | 值意义 |
| AF | 聚合函数 (CLR) |
| C | CHECK 约束 |
| D | DEFAULT(约束或独立) |
| F | FOREIGN KEY 约束 |
| PK | PRIMARY KEY 约束 |
| P | 存储过程 |
| PC | 程序集 (CLR) 存储过程 |
| FN | 标量函数 |
| FS | 程序集 (CLR) 标量函数 |
| FT | 程序集 (CLR) 表值函数 |
| R | 规则(旧式,独立) |
| RF | 复制筛选过程 |
| SN | 同义词 |
| SQ | 服务队列 |
| TA | 程序集 (CLR) DML 触发器 |
| TR | DML 触发器 |
| IF | 内联表值函数 |
| TF | 表值函数 |
| U | 表(用户定义类型) |
| UQ | UNIQUE 约束 |
| V | 视图 |
| X | 扩展存储过程 |
| IT | 内部表 |
所以上面的xtype='P'代表的就是查询存储过程。
那到这里就很清晰了,三步完成:
- 查询出来所有的存储过程(SELECT name FROM sys.sysobjects WHERE xtype='P');
- 循环存储过程获取文本(sp_helptext '存储过程名称');
- 匹配文本里面是否存储指定字符串。
我们把这个步骤翻译为可视化操作,直接点点点就行。
之前我们聊过代码可视化(生成实体),我们就接着这个写进行实现。
当然,你重新新建也可以,就几行代码完成,很简单的。
可视化生成实体的感兴趣的也可以去看看,演示地址:http://entity.xiongze.net/
手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)
效果展示


在线演示地址
在线演示地址: http://entity.xiongze.net/Home/About
源码下载地址
链接:https://pan.baidu.com/s/1j-oU4gzszqV5nYN64WfLiw?pwd=xion
提取码:xion
代码实现
创建一个ASP.NET Web应用,命名为GenerateEntity,或者创建你自己的项目,哪一种都可以。
然后我直接贴出代码,大家直接复制就可以使用。
页面代码
需要注意,这是基于jQuery的ajax请求,如果没有进入jQuery的需要引入一下。
<div style="margin-top:10px;font-family:'Microsoft YaHei';font-size:18px; ">
<h3 style="color:red;">根据关键字查询存储过程/函数</h3>
<h4>下面server是需要连接的数据库的服务器名称,uid是登录名,pwd是密码,database是指定数据库名</h4>
<div style="height:100px;width:100%;border:1px solid gray;padding:10px">
<div>
<span>链接数据库:</span>
<input style="width:100%;max-width:800px;" id="Link" value="server=192.168.0.1;uid=sa;pwd=123456;database=mydatabase" />
</div>
<div style="margin-top:10px">
<span>查询关键字:</span>
<input style="width:400px;max-width:400px;" placeholder="输入需要查询的关键字" autofocus id="keyWord" /> <span>生成类型:</span>
<select id="type">
<option value="0">查询存储过程</option>
<option value="1">查询函数</option>
</select>
<a href="javascript:void(0)" onclick="GenerateEntity()" style="margin-left:20px;font-weight:600;">查询关键字所在位置</a>
</div>
</div>
<div style="height:720px;width:100%;float:left;border:1px solid gray;overflow: auto;padding:10px;" id="showTable"> </div>
</div> <script type="text/javascript"> function GenerateEntity() {
var keyWord = $("#keyWord").val().trim();
if (keyWord == "") {
alert("需要查询的关键字不能为空");
return;
}
$.ajax({
url: "/Home/GetKeyWord",
data: { Link: $("#Link").val(), keyWord: keyWord, type: $("#type").val() },
type: "POST",
async: false,
dataType: "json",
success: function (data) {
if (data.res) {
if (data.info != "") {
var info = eval("(" + data.info + ")"); $("#showTable").html("");
var showTable = '<h4>总共查询出 <span style="color:red">' + info.length + '</span> 条数据</h4><br />'; for (var i = 0; i < info.length; i++) {
showTable += "<a>" + info[i] + "</a><br/>";
}
$("#showTable").html(showTable);
}
}
else {
alert(data.msg);
$("#showTable").html("没有查询到数据!");
}
}
});
} </script>
后端代码
#region 根据关键字查询存储过程/函数
//根据数据库名查询所有表
public JsonResult GetKeyWord(string Link, string keyWord,string type)
{
ResultInfo result = new ResultInfo();
int num = 0;
List<string> TextList = new List<string>();
try
{
string sql = @"select 'sp_helptext ' + name from sys.sysobjects where xtype = 'P'"; //查询所有的存储过程
if (type == "1")
sql = @"select 'sp_helptext ' + name from sys.sysobjects where xtype in ('FN', 'TF') order by xtype, name"; //查询所有函数
DataTable dt = GetDataToDt(sql, "dtTable", Link); //连接数据库查询【存储过程】数据
if (dt != null && dt.Rows.Count > 0)
{
//循环存储过程
foreach (DataRow dr in dt.Rows)
{
DataTable dt_text = GetDataToDt(dr[0].ToString(), "dtTable_text", Link); //连接数据库查询【存储过程】文本内容
if (dt_text != null && dt_text.Rows.Count > 0)
{
foreach (DataRow rr in dt_text.Rows)
{
if (rr[0].ToString().ToLower().IndexOf(keyWord.ToLower()) != -1) //判断是匹配指定字符串
{
TextList.Add(dr[0].ToString().Replace("sp_helptext ", "")); //将存储过程名称添加到返回的集合列表
num++;
break;
}
}
}
}
}
result.info = Newtonsoft.Json.JsonConvert.SerializeObject(TextList);
result.res = true;
result.msg = "查询成功!";
}
catch (Exception ex)
{
result.msg = ex.Message;
}
return Json(result, JsonRequestBehavior.AllowGet);
}
/// <summary>
/// ORM数据库连接
/// </summary>
/// <param name="sql">查询语句</param>
/// <param name="tbName">自定义的表名</param>
/// <param name="conStr">数据库连接</param>
/// <returns></returns>
public static DataTable GetDataToDt(string sql, string tbName, string conStr = null)
{
//这里使用using或者手动Close都可以
SqlConnection sqlCon = new SqlConnection(conStr);
DataSet ds = new DataSet();
DataTable dt = null;
try
{
SqlCommand cmd = new SqlCommand(sql, sqlCon);
cmd.CommandTimeout = 1000;
SqlDataAdapter sqlDa = new SqlDataAdapter(cmd);
sqlCon.Open();
sqlDa.Fill(ds, tbName);
if (ds != null && ds.Tables.Count > 0)
{
dt = ds.Tables[tbName];
}
}
catch (Exception ex)
{
dt = null;
}
finally
{
sqlCon.Close();
}
return dt;
}
#endregion
//封装返回信息数据
public class ResultInfo
{
public ResultInfo()
{
res = false;
startcode = 449;
info = "";
}
public bool res { get; set; } //返回状态(true or false)
public string msg { get; set; } //返回信息
public int startcode { get; set; } //返回http的状态码
public string info { get; set; } //返回的结果(res为true时返回结果集,res为false时返回错误提示)
}
这样一套可视化【快速查询包含指定字符串的存储过程】就出来了,我们把他发布到IIS上面,然后设置为浏览器标签(收藏),这样就可以快捷使用了。
我们运行一下看看,是不是感觉很方便呀!
PS:数据库连接地址一定要填正确,否则数据返回结果为空。


总结
存储过程及里面的文本包含的指定字符串就是这么查询。
那其余的我们是不是可以举一反三了?例如函数、视图、表都可以按照这种方式来,只需要把xtype的条件替换一下即可。
感兴趣的话赶快去试试吧。
参考文献
喜欢就点赞加关注。
欢迎关注订阅微信公众号【熊泽有话说】,更多好玩易学知识等你来取
作者:熊泽-学习中的苦与乐
公众号:熊泽有话说
QQ群:711838388
出处:https://www.cnblogs.com/xiongze520/p/16491802.html
您可以随意转载、摘录,但请在文章内注明作者和原文链接。

可视化查询(sp_helptext)——快速查询包含指定字符串的存储过程(附源码)的更多相关文章
- android tesseract-ocr实例教程(包含中文识别)(附源码)
(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.介绍 快过年了,博主的新应用-屏幕取词之了老花镜的编码工作也在紧锣密鼓的进行中.下面分享一下这个应用 ...
- PHP判断字符串中是否包含指定字符串,支持中文哦
RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...
- js判断是否包含指定字符串
CreateTime--2017年2月28日09:37:06Author:Marydonjs判断是否包含指定字符串 var inputValue = "thunder://piaohua ...
- Vim 删除不包含指定字符串的行及统计匹配个数
Vim 删除不包含指定字符串的行及统计匹配个数 转载▼ Help :g/pattern/d 是找到pattern, 删之 :v/pattern/d 是找到非pattern, 删之 :%s/xx ...
- Mybatis+SpringMVC实现分页查询(附源码)
Maven+Mybatis+Spring+SpringMVC实现分页查询(附源码) 一.项目搭建 关于项目搭建,小宝鸽以前写过一篇Spirng+SpringMVC+Maven+Mybatis+MySQ ...
- 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)
本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...
- 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)
在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...
- vue 快速入门 系列 —— 侦测数据的变化 - [vue 源码分析]
其他章节请看: vue 快速入门 系列 侦测数据的变化 - [vue 源码分析] 本文将 vue 中与数据侦测相关的源码摘了出来,配合上文(侦测数据的变化 - [基本实现]) 一起来分析一下 vue ...
- 【C#】判断字符串中是否包含指定字符串,contains与indexof方法效率问题
#方法一:使用string.Contains方法 string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个key ...
随机推荐
- 基于mybatis的java代码生成存储过程
问题: 项目中目前使用mybatis操作数据库,使用插件(mybatis-generator)自动生成代码,对于增改查,使用存储过程实现了一版本,方便使用. insert代码生成器用法: insert ...
- 五三想休息,今天还学习,图解二叉树的层序遍历BFS(广度优先)模板,附面试题题解
壹 ❀ 引 我在从JS执行栈角度图解递归以及二叉树的前.中.后遍历的底层差异一文中,从一个最基本的数组遍历引出递归,在掌握递归的书写规则后,又从JS执行栈角度解释了二叉树三种深度优先(前序.中序后序) ...
- 关闭BottomSheetDialogFragment从后台返回后的动画
问题 显示BottomSheetDialogFragment后.将当前应用放于后台,切换到其他APP,然后再返回当前应用.此时会看到BottomSheetDialogFragment从下而上的动画再次 ...
- Atlas2.2.0编译、安装及使用(集成ElasticSearch,导入Hive数据)
1.编译阶段 组件信息: 组件名称 版本 Atals 2.2.0 HBase 2.2.6 Hive 3.1.2 Hadoop 3.1.1 Kafka 2.11_2.4.1 Zookeeper 3.6. ...
- Elasticsearch高级之-集群搭建,数据分片
目录 Elasticsearch高级之-集群搭建,数据分片 一 广播方式 二 单播方式 三 选取主节点 四 什么是脑裂 五 错误识别 Elasticsearch高级之-集群搭建,数据分片 es使用两种 ...
- 2021夏季学期华清大学EE数算OJ1:算数问题
第一次写博客,有点紧张... 也许格式也没有特别丑吧 先看原题( 此题做法众多,这里仅仅介绍蒟蒻的一种很复杂的思路(但最后还是喜提0ms的好成绩) 读完这道题,不难发现,此题不过是一个质因数分解+一堆 ...
- 【算法】插入排序(Insertion Sort)(三)
插入排序(Insertion Sort) 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相 ...
- Fail2ban 简介
Fail2ban是一个基于日志的IP自动屏蔽工具.可以通过它来防止暴力破解攻击. Fail2ban通过扫描日志文件(例如/var/log/apache/error_log),并禁止恶意IP(太多的密码 ...
- HDFS 细粒度锁优化,FusionInsight MRS有妙招
摘要:华为云FusionInsight MRS通过FGL对HDFS NameNode锁机制进行优化,有效提升了NameNode的读写吞吐量,从而能够支持更多数据,更多业务请求访问,从而更好的支撑政企客 ...
- Change Buffer 只适用于非唯一索引页?错
最近在网上看到一些文章里说:"change buffer 只适用于非唯一索引页."其实这个观点是错的,先来看看官方文档对 change buffer 的介绍: 文档地址:https ...