在SQL Server中,我们经常遇到一些需求,需要去搜索存储过程(Procedure)、函数(Function)等对象是否包含某个对象或涉及某个对象,例如,我需要查找那些存储过程、函数是否调用了链接服务器(LINKED SERVER),我们如果从sys.sql_modules去搜索的话,如果有多个用户数据库,需要切换数据库,执行多次SQL语句。这些都是非常麻烦的事情。本着“模块化定制脚本,减少重复工作量”的原则。写了一个脚本find_prc_from_src_txt.sql, 以后在根据不同的需求逐步完善!
-==================================================================================================================
知识兔!--CRLF-->sql
知识兔!--CRLF-->- Author : 潇湘隐者
知识兔!--CRLF-->- CreateDate : 2019-10-22
知识兔!--CRLF-->- Description : 在SQL Server实例中通过条件搜索所有数据库的存储过程、函数、视图,找出这些对象
知识兔!--CRLF-->- Note :
知识兔!--CRLF-->/*******************************************************************************************************************
知识兔!--CRLF--> Parameters : 参数说明
知识兔!--CRLF-->********************************************************************************************************************
知识兔!--CRLF--> @src_text : 你要搜索的条件,例如,想找出那些存储过程有调用某个链接服务器:@src_text=xxxx
知识兔!--CRLF-->********************************************************************************************************************
知识兔!--CRLF--> Notice : 由于效率问题,有时候会被阻塞,在tempdb等待LCK_M_SCH_S
知识兔!--CRLF-->********************************************************************************************************************
知识兔!--CRLF--> Modified Date Modified User Version Modified Reason
知识兔!--CRLF-->********************************************************************************************************************
知识兔!--CRLF--> 2019-10-22 潇湘隐者 V01.00.00 新建该脚本。
知识兔!--CRLF-->*******************************************************************************************************************/
知识兔!--CRLF-->-==================================================================================================================
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->DECLARE @cmdText NVARCHAR(MAX);
知识兔!--CRLF-->DECLARE @database_name NVARCHAR(64);
知识兔!--CRLF-->DECLARE @src_text NVARCHAR(128);
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->SET @src_text='xxxx' --根据实际情况输入查询、搜索条件
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->IF OBJECT_ID('TempDB.dbo.#databases') IS NOT NULL
知识兔!--CRLF-->DROP TABLE dbo.#databases;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->CREATE TABLE #databases
知识兔!--CRLF-->
知识兔!--CRLF-->INT,
知识兔!--CRLF-->nbsp; database_name sysname
知识兔!--CRLF-->;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->INTO #databases
知识兔!--CRLF-->SELECT database_id ,
知识兔!--CRLF-->nbsp; name
知识兔!--CRLF-->FROM sys.databases
知识兔!--CRLF-->WHERE name NOT IN ('model') AND state = 0; --state_desc=ONLINE
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->IF OBJECT_ID('TempDB.dbo.#sql_modules') IS NOT NULL
知识兔!--CRLF-->DROP TABLE #sql_modules;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->/**********************************************************************************************************
知识兔!--CRLF-->此处如果用这种写法,就会报下面错误,所以用下面这种写法。
知识兔!--CRLF-->
知识兔!--CRLF-->SELECT '' AS database_name, t.* INTO #sql_modules
知识兔!--CRLF-->FROM sys.sql_modules t WITH(NOLOCK) WHERE 1=0;
知识兔!--CRLF-->------------------------------------------------------------------------———----------------------------
知识兔!--CRLF-->Msg 8152, Level 16, State 2, Line 2
知识兔!--CRLF-->将截断字符串或二进制数据。
知识兔!--CRLF-->**********************************************************************************************************/
知识兔!--CRLF-->SELECT 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' AS database_name
知识兔!--CRLF-->INTO #sql_modules
知识兔!--CRLF-->FROM sys.sql_modules t WITH(NOLOCK) WHERE 1=0;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->WHILE 1= 1
知识兔!--CRLF-->BEGIN
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->SELECT TOP 1 @database_name= database_name
知识兔!--CRLF-->FROM #databases
知识兔!--CRLF-->ORDER BY database_id;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->IF @@ROWCOUNT =0
知识兔!--CRLF-->BREAK;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->SET @cmdText = N'USE ' + QUOTENAME(@database_name) + N';' +CHAR(10)
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->//**********************************************************************************************************
知识兔!--CRLF-->SELECT @cmdText += N'INSERT INTO ##sql_modules
知识兔!--CRLF-->nbsp; SELECT *
知识兔!--CRLF-->nbsp; FROM sys.sql_modules W
知识兔!--CRLF-->'%@p_src_text%'';' + CHAR(10);
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->EXEC SP_EXECUTESQL @cmdText, N'@p_src_text NVARCHAR(128)',@p_src_text=@src_text;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->nbsp; 此种方式不生效。这里弃用这种动态SQL执行方式
知识兔!--CRLF-->nbsp; ***********************************************************************************************************/
知识兔!--CRLF-->SELECT @cmdText += N'INSERT INTO #sql_modules
知识兔!--CRLF-->nbsp; SELECT @p_database_name
知识兔!--CRLF-->nbsp; , t.*
知识兔!--CRLF-->nbsp; FROM sys.sql_modules t WITH(NOLOCK)
知识兔!--CRLF-->'%' +@src_text +'%'';' + CHAR(10);
知识兔!--CRLF-->EXEC SP_EXECUTESQL @cmdText,N'@p_database_name NVARCHAR(64)',@p_database_name=@database_name;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->DELETE FROM #databases WHERE database_name=@database_name;
知识兔!--CRLF-->END
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->SELECT * FROM tempdb.dbo.#sql_modules;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->nbsp;
知识兔!--CRLF-->IF OBJECT_ID('TempDB.dbo.#databases') IS NOT NULL
知识兔!--CRLF-->DROP TABLE dbo.#databases;
知识兔!--CRLF-->IF OBJECT_ID('TempDB.dbo.#sql_modules') IS NOT NULL
知识兔!--CRLF-->DROP TABLE #sql_modules;
知识兔!--CRLF-->