前言

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

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

在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. 【翻译】ScyllaDB数据建模的最佳实践

    文章翻译自Scylla官方文档:https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ 转载请注明出处:https: ...

  2. 做SaaS的程序员们,是时候关注企业架构了

    SaaS赛道是一个超大赛道,足够容纳上万家服务商,不太可能有哪个服务商能满足所有场景,大部分SaaS服务商在某个垂直领域,提供差异化的产品和服务.SaaS产品大部分都是面向B端客户,少部分面向C端客户 ...

  3. kafka基础原理

    1.什么是kafka Kafka 是一个分布式的基于发布/订阅模式的消息队列 消息队列的两种模式: 点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除).特点,一个消息只能被一个消费者消费 发 ...

  4. 【面试普通人VS高手系列】说一说Mybatis里面的缓存机制

    一个工作了 5年的程序员,在私信里面不断向我诉苦. 他说,他用了Mybatis这么久,怎么滴也算是精通Mybatis了吧. 结果竟然在Mybatis这个面试题上翻车了! 真的好烦! 好吧,我们今天来看 ...

  5. Git 日志提交规范

    Commit messages的基本语法 当前业界应用的比较广泛的是 Angular Git Commit Guidelines 具体格式为: <type>: <subject> ...

  6. Swift初探01 变量与控制流

    Swift初探01 变量与控制流 输出"hello world"是几乎学习所有编程语言的第一课,这是程序员的情怀. 所以我们学习swift的第一步,就是输出一句"Hell ...

  7. Ubuntu16.04编译OpenJDK7u40

    下图是OpenJDK6.OpenJDK7.OpenJDK7u和OpenJDK8这几个项目之间的关系: 下面把编译步骤记录下来: 编译环境 Ubuntu 16.04.4 LTS jdk版本 openjd ...

  8. MUI+html5+script 不同页面间转跳(九宫格)

    在点击图片/标题需要跳转到详情页面的使用场景中,首先定义图片元素的id为"tyzc",是同一类下的第一个图片 <img src="img/img3.png" ...

  9. CSP-J游记

    祝大家 CSP-J/CSP-S 稳过第一轮 ~(- ∨ -)~ ~~ 建议扩大110%食用 ~~ 中秋快乐鸭(希望大家不会收到损友送的砖头月饼 : − ) :-) :−)) 咳咳,昨天是我们可爱初赛来 ...

  10. 微服务效率工具 goctl 深度解析(上)

    前言 本文根据 安前松 的视频分享整理而来,视频回放地址如下: https://www.bilibili.com/video/BV1Hr4y1x7Ne goctl 的由来 1. goctl 的诞生 g ...