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

--==================================================================================================================

--        ScriptName          :            find_prc_from_src_txt.sql

--        Author              :            潇湘隐者    

--        CreateDate          :            2019-10-22

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

--        Note                :            

/*******************************************************************************************************************

        Parameters            :                                    参数说明

********************************************************************************************************************

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

********************************************************************************************************************

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

********************************************************************************************************************

   Modified Date    Modified User     Version                 Modified Reason

********************************************************************************************************************

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

*******************************************************************************************************************/

--==================================================================================================================

 

DECLARE @cmdText        NVARCHAR(MAX);

DECLARE @database_name  NVARCHAR(64);

DECLARE @src_text        NVARCHAR(128);

 

 

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

 

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

    DROP TABLE dbo.#databases;

 

CREATE TABLE #databases

(

    database_id     INT,

    database_name   sysname

);

 

INSERT  INTO #databases

SELECT  database_id ,

        name

FROM    sys.databases

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

 

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

    DROP TABLE #sql_modules;

 

/**********************************************************************************************************

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


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

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

------------------------------------------------------------------------———----------------------------

Msg 8152, Level 16, State 2, Line 2

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

**********************************************************************************************************/

SELECT 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' AS database_name

    ,  t.* INTO #sql_modules   

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

 

 

WHILE 1= 1

BEGIN

 

 

    SELECT TOP 1 @database_name= database_name   

    FROM #databases

    ORDER BY database_id;

 

    IF @@ROWCOUNT =0 

        BREAK;

 

 

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

 

    //**********************************************************************************************************

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

    SELECT  *

    FROM    sys.sql_modules W

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

 

    

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

 

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

    ***********************************************************************************************************/

    SELECT @cmdText += N'INSERT INTO #sql_modules

                       SELECT @p_database_name

                             , t.*

                       FROM    sys.sql_modules t WITH(NOLOCK)

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

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

    

    DELETE FROM #databases WHERE database_name=@database_name;

END

 

SELECT * FROM tempdb.dbo.#sql_modules;

 

 

 

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

    DROP TABLE dbo.#databases;

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

    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. Nginx(http协议代理 搭建虚拟主机 服务的反向代理 在反向代理中配置集群的负载均衡)

    Nginx 简介 Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务.Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开 ...

  2. HDU1224-Free DIY Tour(SPFA+路径还原)

    Weiwei is a software engineer of ShiningSoft. He has just excellently fulfilled a software project w ...

  3. Python爬虫--喜马拉雅三国音频爬取

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Botreechan  1.进入地址我们可以发现,页面有着非常整齐的目 ...

  4. tensorflow处理mnist(二)

    用卷积神经网络解决mnist的分类问题. 简单的例子 一行一行解释这个代码. 这个不是google官方的例子,但是很简洁,便于入门.tensorflow是先定义模型,最后赋值,计算.为了讨论问题方便, ...

  5. 【NPM】361- 10个 NPM 使用技巧

    点击上方"前端自习课"关注,学习起来~ 对于一个项目,常用的一些npm简单命令包含的功能有: 初始化一个文件夹( npm init ) 下载npm模块( npm install ) ...

  6. java容器篇

    引言 第三天卡... 今天主要看了下java容器方面的知识,很累但是很充实.吃两把鸡去了,休息一下,再战. 开始 -Collection 存储对象的集合:Map 存储键值对的映射表    -Itera ...

  7. NodeJS4-3静态资源服务器实战_优化成近似同步写法

    实例3 上面有点回调,优化成近似同步的写法 route.js const fs =require('fs') const promisify = require('util').promisify; ...

  8. 你不知道的JavaScript(上)this和对象原型(四)原型

    五章 原型 1.[[ Prototype ]] JavaScript 中的对象有一个特殊的 [[Prototype]] 内置属性,其实就是对于其他对象的引用.几乎所有的对象在创建时 [[Prototy ...

  9. hdu 6298 Maximum Multiple (简单数论)

    Maximum Multiple Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. 常见面试题之*args

    这个地方理解即可,只是面试的时候会被问到,单独做了一下知识点的整理,不推荐使用. def self_max(a,b,c,d,e,f,g,h,k,x=1,y=3,z=4): #默认参数 print(a, ...