- --==================================================================================================================
- -- 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;