在SQL Server中,我们经常遇到一些需求,需要去搜索存储过程(Procedure)、函数(Function)等对象是否包含某个对象或涉及某个对象,例如,我需要查找那些存储过程、函数是否调用了链接服务器(LINKED SERVER),我们如果从sys.sql_modules去搜索的话,如果有多个用户数据库,需要切换数据库,执行多次SQL语句。这些都是非常麻烦的事情。本着“模块化定制脚本,减少重复工作量”的原则。写了一个脚本find_prc_from_src_txt.sql, 以后在根据不同的需求逐步完善!

  1. --==================================================================================================================

  1. --        ScriptName          :            find_prc_from_src_txt.sql

  1. --        Author              :            潇湘隐者   

  1. --        CreateDate          :            2019-10-22

  1. --        Description         :            SQL Server实例中通过条件搜索所有数据库的存储过程、函数、视图,找出这些对象

  1. --        Note                :           

  1. /*******************************************************************************************************************

  1.         Parameters            :                                    参数说明

  1. ********************************************************************************************************************

  1.             @src_text         :            你要搜索的条件,例如,想找出那些存储过程有调用某个链接服务器:@src_text=xxxx

  1. ********************************************************************************************************************

  1.         Notice                            由于效率问题,有时候会被阻塞,在tempdb等待LCK_M_SCH_S

  1. ********************************************************************************************************************

  1.    Modified Date    Modified User     Version                 Modified Reason

  1. ********************************************************************************************************************

  1.     2019-10-22        潇湘隐者         V01.00.00        新建该脚本。

  1. *******************************************************************************************************************/

  1. --==================================================================================================================

  1.  

  1. DECLARE @cmdText        NVARCHAR(MAX);

  1. DECLARE @database_name  NVARCHAR(64);

  1. DECLARE @src_text        NVARCHAR(128);

  1.  

  1.  

  1. SET @src_text='xxxx' --根据实际情况输入查询、搜索条件

  1.  

  1. IF OBJECT_ID('TempDB.dbo.#databases') IS NOT NULL

  1.     DROP TABLE dbo.#databases;

  1.  

  1. CREATE TABLE #databases

  1. (

  1.     database_id     INT,

  1.     database_name   sysname

  1. );

  1.  

  1. INSERT  INTO #databases

  1. SELECT  database_id ,

  1.         name

  1. FROM    sys.databases

  1. WHERE name NOT IN ('model') AND state = 0; --state_desc=ONLINE

  1.  

  1. IF OBJECT_ID('TempDB.dbo.#sql_modules') IS NOT NULL

  1.     DROP TABLE #sql_modules;

  1.  

  1. /**********************************************************************************************************

  1. 此处如果用这种写法,就会报下面错误,所以用下面这种写法。

  1.  

  1. SELECT '' AS database_name,  t.* INTO #sql_modules  

  1. FROM sys.sql_modules t WITH(NOLOCK) WHERE 1=0;

  1. ------------------------------------------------------------------------———----------------------------

  1. Msg 8152, Level 16, State 2, Line 2

  1. 将截断字符串或二进制数据。

  1. **********************************************************************************************************/

  1. SELECT 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' AS database_name

  1.     ,  t.* INTO #sql_modules  

  1. FROM sys.sql_modules t WITH(NOLOCK) WHERE 1=0;

  1.  

  1.  

  1. WHILE 1= 1

  1. BEGIN

  1.  

  1.  

  1.     SELECT TOP 1 @database_name= database_name  

  1.     FROM #databases

  1.     ORDER BY database_id;

  1.  

  1.     IF @@ROWCOUNT =0

  1.         BREAK;

  1.  

  1.  

  1.     SET @cmdText =  N'USE ' + QUOTENAME(@database_name) + N';' +CHAR(10)

  1.  

  1.     //**********************************************************************************************************

  1.     SELECT @cmdText += N'INSERT INTO ##sql_modules

  1.     SELECT  *

  1.     FROM    sys.sql_modules W

  1.     WHERE   definition LIKE ''%@p_src_text%'';' + CHAR(10);

  1.  

  1.    

  1.     EXEC SP_EXECUTESQL @cmdText, N'@p_src_text NVARCHAR(128)',@p_src_text=@src_text;

  1.  

  1.     此种方式不生效。这里弃用这种动态SQL执行方式

  1.     ***********************************************************************************************************/

  1.     SELECT @cmdText += N'INSERT INTO #sql_modules

  1.                        SELECT @p_database_name

  1.                              , t.*

  1.                        FROM    sys.sql_modules t WITH(NOLOCK)

  1.                        WHERE   definition LIKE ''%' +@src_text +'%'';' + CHAR(10);

  1.     EXEC SP_EXECUTESQL @cmdText,N'@p_database_name NVARCHAR(64)',@p_database_name=@database_name;

  1.    

  1.     DELETE FROM #databases WHERE database_name=@database_name;

  1. END

  1.  

  1. SELECT * FROM tempdb.dbo.#sql_modules;

  1.  

  1.  

  1.  

  1. IF OBJECT_ID('TempDB.dbo.#databases') IS NOT NULL

  1.     DROP TABLE dbo.#databases;

  1. IF OBJECT_ID('TempDB.dbo.#sql_modules') IS NOT NULL

  1.     DROP TABLE #sql_modules;

SQL Server通过条件搜索获取相关的存储过程等对象的更多相关文章

  1. 腾讯云图片鉴黄集成到C# SQL Server 怎么在分页获取数据的同时获取到总记录数 sqlserver 操作数据表语句模板 .NET MVC后台发送post请求 百度api查询多个地址的经纬度的问题 try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后? js获取某个日期

    腾讯云图片鉴黄集成到C#   官方文档:https://cloud.tencent.com/document/product/641/12422 请求官方API及签名的生成代码如下: public c ...

  2. SQL SERVER 2005中如何获取日期(一个月的最后一日、上个月第一天、最后一天、一年的第一日等等)

    原文:[转]SQL SERVER 2005中如何获取日期(一个月的最后一日.上个月第一天.最后一天.一年的第一日等等) 在网上找到的一篇文章,相当不错哦O(∩_∩)O~ //C#本周第一天       ...

  3. SQL Server多条件查询的实现

    SQL Server多条件查询的实现 SQL Server多条件查询我们经常会用到,下面就教您如何使用存储过程实现SQL Server多条件查询,希望对您学习SQL Server多条件查询方面有所帮助 ...

  4. SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

    原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. ...

  5. sql server 2000 单主键高效分页存储过程 (支持多字段排序)

    sql server 2000 单主键高效分页存储过程 (支持多字段排序) Create PROC P_viewPage             /*              nzperfect [ ...

  6. SQL Server里一些未公开的扩展存储过程

    SQL Server里一些未公开的扩展存储过程 [转帖] 博客天地 www.inbaidu.com SQL Server里一些未公开的扩展存储过程 扩展存储过程(xp)是直接运行在SQL Server ...

  7. SQL Server 查询、搜索命令、语句

    --查询所有表 SELECT NAME,* FROM SYSOBJECTS WHERE XTYPE='U' order by SYSOBJECTS.name --查询所有存储过程 select * f ...

  8. sql server系统表和视图相关的语句

    一.系统表 数据字典的详细信息请查SQL SERVER BOL,这里仅列出一部分. 1.1.sysservers 1.查看所有本地服务器及链接服务器 select * from master..sys ...

  9. 安装 SQL Server 2008 和管理工具 SQL Server 2008 management studio 及相关问题解决

    Sql Server 2008 问题小总结 http://www.lihengyu.com/blog/4877.html 安装 SQL Server 2008 和管理工具 SQL Server 200 ...

随机推荐

  1. MyBatis之MyBatis Generator逆向工程

    官网地址 http://mybatis.org/generator/ 下载地址 http://central.maven.org/maven2/org/mybatis/generator/mybati ...

  2. C#语言和SQL Server数据库技术_My Bank银行系统

    第一个类: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System ...

  3. 2019ICPC 上海网络赛 G题 Substring(哈希)

    题意: 给了一个母串S, 每次循环给了一个模板串,问模板串在母 串中“匹配”了多少次?“匹配”的意思就是首字母和尾字母一样, 中间字母顺序可以换. 题解: 字符串hash.我们将询问字符串的首尾特殊h ...

  4. Ceph 提供iSCSI存储

    Tgtd+Ceph部署 一.yum安装tgt [root@c720181 ~]# yum --enablerepo=epel -y install scsi-target-utils libxslt ...

  5. 详解numpy的argmax

    从最简单的例子出发 假定现在有一个数组a = [3, 1, 2, 4, 6, 1]现在要算数组a中最大数的索引是多少.这个问题对于刚学编程的同学就能解决.最直接的思路,先假定第0个数最大,然后拿这个和 ...

  6. Day 02 作业

    作业 一 什么是编程? 基于编程语言的语法格式将自己脑中里想让计算机做的事,写到文件中. 二 简述计算机五大组成 控制器,运算器,存储器,输入设备,输出设备 三 操作系统有什么用? 操作系统直接与硬件 ...

  7. Python流程控制之分支结构

    目录 if/else结构 多重if结构 嵌套if结构 练习 if/else结构 if如果,else否则 # java if(){ }else{ } # python if 条件: 语句 else: 语 ...

  8. 为什么要使用MQ消息中间件?这3个点让你彻底明白!

    前言 一个用消息队列的人,不知道为啥用,有点尴尬.没有复习这点,很容易被问蒙,然后就开始胡扯了. 回答:这个问题,咱只答三个最主要的应用场景,不可否认还有其他的,但是只答三个主要的,即以下六个字: 解 ...

  9. Spring-web-security Issue (Access is denied. User must have one of the these roles: ACTUATOR)

    前提条件(Prerequisite) 1.你的项目里引进了Spring web security <dependency> <groupId>org.springframewo ...

  10. linux mysql 数据库复制

    一.主服务器配置 1.配置文件my.cnf的修改 [root@localhost mysql]# vim /etc/my.cnf #在[mysqld]中添加:server-id=1log_bin=ma ...