前言

在开发中,随着业务逻辑的调整,修改存储过程是必不可免的。

那怎么定位到需要修改的存储过程呢?一个一个的点开查询?存储过程少的话还行,一旦存储过程过多,这样是很浪费时间的,一个不注意还会遗漏掉。

在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'代表的就是查询存储过程。

那到这里就很清晰了,三步完成:

  1. 查询出来所有的存储过程(SELECT name  FROM sys.sysobjects  WHERE xtype='P');
  2. 循环存储过程获取文本(sp_helptext '存储过程名称');
  3. 匹配文本里面是否存储指定字符串。

我们把这个步骤翻译为可视化操作,直接点点点就行。

之前我们聊过代码可视化(生成实体),我们就接着这个写进行实现。

当然,你重新新建也可以,就几行代码完成,很简单的。

可视化生成实体的感兴趣的也可以去看看,演示地址: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的条件替换一下即可。

感兴趣的话赶快去试试吧。

参考文献

[1].sp_helptext - 百度百科

[2].sysobjects - 百度百科

喜欢就点赞加关注。

欢迎关注订阅微信公众号【熊泽有话说】,更多好玩易学知识等你来取
作者:熊泽-学习中的苦与乐
公众号:熊泽有话说

QQ群:711838388
出处:https://www.cnblogs.com/xiongze520/p/16491802.html
您可以随意转载、摘录,但请在文章内注明作者和原文链接。 

可视化查询(sp_helptext)——快速查询包含指定字符串的存储过程(附源码)的更多相关文章

  1. android tesseract-ocr实例教程(包含中文识别)(附源码)

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.介绍     快过年了,博主的新应用-屏幕取词之了老花镜的编码工作也在紧锣密鼓的进行中.下面分享一下这个应用 ...

  2. PHP判断字符串中是否包含指定字符串,支持中文哦

    RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...

  3. js判断是否包含指定字符串

      CreateTime--2017年2月28日09:37:06Author:Marydonjs判断是否包含指定字符串 var inputValue = "thunder://piaohua ...

  4. Vim 删除不包含指定字符串的行及统计匹配个数

    Vim 删除不包含指定字符串的行及统计匹配个数 转载▼     Help :g/pattern/d 是找到pattern, 删之 :v/pattern/d 是找到非pattern, 删之 :%s/xx ...

  5. Mybatis+SpringMVC实现分页查询(附源码)

    Maven+Mybatis+Spring+SpringMVC实现分页查询(附源码) 一.项目搭建 关于项目搭建,小宝鸽以前写过一篇Spirng+SpringMVC+Maven+Mybatis+MySQ ...

  6. 聊天系统Demo,增加文件传送功能(附源码)-- ESFramework 4.0 快速上手(14)

    本文我们将介绍在ESFramework 4.0 快速上手(08) -- 入门Demo,一个简单的IM系统(附源码)的基础上,增加文件传送的功能.如果不了解如何使用ESFramework提供的文件传送功 ...

  7. 聊天系统Demo,增加Silverlight客户端(附源码)-- ESFramework 4.0 快速上手(09)

    在ESFramework 4.0 快速上手 -- 入门Demo,一个简单的IM系统(附源码)一文中,我们介绍了使用ESFramework的Rapid引擎开发的winform聊天程序,本文我们将在之前d ...

  8. vue 快速入门 系列 —— 侦测数据的变化 - [vue 源码分析]

    其他章节请看: vue 快速入门 系列 侦测数据的变化 - [vue 源码分析] 本文将 vue 中与数据侦测相关的源码摘了出来,配合上文(侦测数据的变化 - [基本实现]) 一起来分析一下 vue ...

  9. 【C#】判断字符串中是否包含指定字符串,contains与indexof方法效率问题

    #方法一:使用string.Contains方法 string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个key ...

随机推荐

  1. 用漫画了解Linux内核到底长啥样

    一个执着于技术的公众号 原文链接:http://985.so/hRL6 往期精彩 ◆  干货 | 给小白的Nginx10分钟入门指南 ◆  什么是集群?看完这篇你就知道啦! ◆  干货 | Linux ...

  2. 简述 private、protected、 public、 internal修饰符的访问权限

    1.private: 私有的,只能在此类中访问 2.protected: 受保护的,只能在此类及其继承类中访问 3.public: 公开的,没有访问限制 4:internal: 内部的,只能在当前程序 ...

  3. 【软件构造】Mutable类型与Immutable类型

    [软件构造]Mutable类型与Immutable类型 1.前言 在软件构造这门课中,对mutable类型和immutable类型的深入理解,有助于后续ADT.可维护性.可复用性的学习,因此我们有必要 ...

  4. 关于Linux添加字体

    安装字体命令 yum -y install fontconfig 查看已经安装的字体 fc-list # 查看已经已经安装的中文字体 fc-list :lang=zh 在字体目录下创建新的目录或者使用 ...

  5. supervisor安装以及监控管理rabbitmq消费者进程

    简介:Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启. 1.安装 apt-get install ...

  6. awk内建函数

    内建函数 length() 获得字符串长度 cat score.txt Marry 2143 78 84 77 Jack 2321 66 78 45 Tom 2122 48 77 71 Mike 25 ...

  7. 每天一个 HTTP 状态码 201

    201 Created 201 Created 表示客户端的请求已经成功完成,结果是创建了一个新资源,通常用于响应「增删改查」里的「增」.如果是严格按照 RESEful style 的 API,那么当 ...

  8. 深入浅出Nginx实战与架构

    本文主要内容如下(让读者朋友们深入浅出地理解Nginx,有代码有示例有图): 1.Nginx是什么? 2.Nginx具有哪些功能? 3.Nginx的应用场景有哪些? 4.Nginx的衍生生态有哪些? ...

  9. 怎样生成分布式的流水ID

    流水编号 日常在我们开发的过程中可能会用到编号的功能,如销售订单号,采购订单号,日志编号,凭证号...等等,为了保证唯一有些表的主键要么用自增长,要么用GUID值,或通过雪花ID算法生成.这此方式基本 ...

  10. Python的关键字参数与斜杠“/”

    Python3.8 新增了一种语法,可以使用斜杠 / 占据一个参数的位置,表示在此之前的参数都只接受位置参数的传参形式. 例如,对以下函数声明: def func(a, b, /, c, d, *, ...