====== Search module definitions ====== This script will search the text of SQL modules (SPs, functions, view definitions etc) for a specified string. Modules are matched on the basis of a SQL "''[definition] LIKE '%searchString%'''" operation, so the same identifier with and without delimiters is **different**. DECLARE @searchText NVARCHAR(MAX) = 'your text here' DECLARE @dbName NVARCHAR(128) = '%' DECLARE @noEscape NVARCHAR(5) = '' -- ***************************************** SET NOCOUNT ON DECLARE @escapeChar NVARCHAR(1) = '\' DECLARE @i INT /* * prepare list of characters to escape */ -- basic list DECLARE @charsToEscape NVARCHAR(3) = '%_[' -- strip out characters NOT to be escaped SET @i = 1 WHILE @i <= LEN(@noEscape) BEGIN SET @charsToEscape = REPLACE (@charsToEscape, SUBSTRING(@noEscape, @i, 1), '') SET @i += 1 END -- need to escape the escape character itself SET @charsToEscape += @escapeChar /* * prepare search */ -- prepare search string by escaping any characters in @charsToEscape SET @i = 1 WHILE @i <= LEN(@charsToEscape) BEGIN SET @searchText = REPLACE ( @searchText , SUBSTRING(@charsToEscape, @i, 1) , @escapeChar + SUBSTRING(@charsToEscape, @i, 1) ) SET @i += 1 END -- prepare search query DECLARE @sql NVARCHAR(MAX) = 'SELECT DB_NAME() , s.[name] , o.[name] , o.type_desc FROM sys.schemas s INNER JOIN sys.objects o ON o.schema_id = s.schema_id INNER JOIN sys.sql_modules c ON c.object_id = o.object_id WHERE UPPER(c.[definition]) LIKE ''%'' + ''' + UPPER(REPLACE(@searchText, '''', '''''')) + ''' + ''%'' ESCAPE ''' + @escapeChar + ''' AND o.[type] IN ( ''V'' -- view , ''P'' -- stored procedure , ''FN'' -- scalar function , ''TF'' -- table function , ''IF'' -- inline table function , ''TR'' -- trigger , ''C'' -- CHECK constraint , ''D'' -- Default , ''RF'' -- Replication filter stored procedure )' -- prepare table for search results DECLARE @results TABLE ( DbName NVARCHAR(128) , SchemaName NVARCHAR(128) , ObjectName NVARCHAR(128) , ObjectType NVARCHAR(128) ) /* * search */ DECLARE @db NVARCHAR(128) DECLARE @dbSql NVARCHAR(MAX) DECLARE @msg NVARCHAR(MAX) = '' DECLARE dbCursor CURSOR LOCAL FOR SELECT [name] FROM [master].sys.databases WHERE [name] LIKE @dbName OPEN dbCursor FETCH NEXT FROM dbCursor INTO @db WHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRY SET @dbSql = 'EXEC [' + @db + '].dbo.sp_executesql N''' + REPLACE(@sql, '''', '''''') + '''' INSERT INTO @results EXEC(@dbSql) END TRY BEGIN CATCH SET @msg += ' - Error ' + CAST(ERROR_NUMBER() AS VARCHAR) + ' searching [' + @db + ']: ' + ERROR_MESSAGE() END CATCH FETCH NEXT FROM dbCursor INTO @db END CLOSE dbCursor DEALLOCATE dbCursor /* * report results */ -- results of search SELECT DbName , SchemaName , ObjectName , ObjectType FROM @results ORDER BY DbName , SchemaName , ObjectName -- any errors IF LEN(@msg) > 0 BEGIN SET @msg = 'Search encountered the following errors:' + @msg RAISERROR(@msg, 11, 1) PRINT 'Any available search results are visible in the results pane.' END ===== Create an SP to do this ===== If you want to turn this into an SP, make the first three variables into parameters, with only the first mandatory: CREATE PROCEDURE [dbo].[usp_SearchModules] ( @searchText NVARCHAR(MAX) , @dbName NVARCHAR(128) = '%' , @noEscape NVARCHAR(5) = '' ) AS SET NOCOUNT ON -- ... {{tag> admin tsql development dynamic}}