• 可视化查询(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'代表的就是查询存储过程。

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

    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的需要引入一下。

    复制代码
    "margin-top:10px;font-family:'Microsoft YaHei';font-size:18px; ">

    "color:red;">根据关键字查询存储过程/函数

    下面server是需要连接的数据库的服务器名称,uid是登录名,pwd是密码,database是指定数据库名

    "height:100px;width:100%;border:1px solid gray;padding:10px">
    链接数据库: "width:100%;max-width:800px;" id="Link" value="server=192.168.0.1;uid=sa;pwd=123456;database=mydatabase" />
    "margin-top:10px"> 查询关键字: "width:400px;max-width:400px;" placeholder="输入需要查询的关键字" autofocus id="keyWord" /> 生成类型: <select id="type"> select> "javascript:void(0)" onclick="GenerateEntity()" style="margin-left:20px;font-weight:600;">查询关键字所在位置
    "height:720px;width:100%;float:left;border:1px solid gray;overflow: auto;padding:10px;" id="showTable">
    复制代码

    后端代码

    复制代码
           #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);
            }
    
            /// 
            /// ORM数据库连接
            /// 
            /// 查询语句
            /// 自定义的表名
            /// 数据库连接
            /// 
            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
    您可以随意转载、摘录,但请在文章内注明作者和原文链接。  

     

     

  • 相关阅读:
    New Work New Life
    YOLO目标检测——昏暗车辆数据集+已标注VOC格式标签下载分享
    JAVA 方法
    记录wisemodel上传失败
    Levels - UE5中的暴雨效果
    基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(五)——多条件搜索并分页展示
    基于python爬取母婴用品评论的数据分析
    拒绝服务攻击(Dos)与Tomcat的解决方法
    面向未来的服务网格发展:展望服务网格技术未来的发展方向和趋势
    【二开】【JeecgBoot】修改分页参数
  • 原文地址:https://www.cnblogs.com/xiongze520/p/16491802.html