经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQL Server通过条件搜索获取相关的存储过程等对象
来源:cnblogs  作者:潇湘隐者  时间:2019/10/22 13:18:26  对本文有异议

   在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. 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;

原文链接:http://www.cnblogs.com/kerrycode/p/11719015.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号