IF Object_id('dbo.usp_SearchOnAllDB', 'P') IS NULL EXECUTE ('CREATE PROCEDURE dbo.usp_SearchOnAllDB AS SELECT 1'); GO ALTER PROCEDURE dbo.usp_SearchOnAllDB(@phrase VARCHAR(8000), @OutFullRecords BIT = 0) AS /* To apply so: exec sp_SearchOnAllDB 'Arme%' exec sp_SearchOnAllDB '%soft%' exec sp_SearchOnAllDB '_5234_57%', 1 exec sp_SearchOnAllDB M_cro_oft */ DECLARE @sql NVARCHAR(max); DECLARE @schema SYSNAME; DECLARE @tbl SYSNAME; DECLARE @col SYSNAME; DECLARE @id_present BIT DECLARE @is_char_phrase BIT DECLARE @min_len INT DECLARE @loop_idx INT DECLARE @loop_chr CHAR(1) SET nocount ON IF Isnull(@phrase, '') = '' BEGIN RAISERROR('Phrase is absent',16,-1) RETURN END -- Handle Quotes passed in the search string SET @phrase = Replace(@phrase, '''', '''''') SELECT @loop_idx = 1, @is_char_phrase = 0, @min_len = 0 WHILE @loop_idx <= Len(@phrase) BEGIN SET @loop_chr = Substring(@phrase, @loop_idx, 1) IF @loop_chr NOT IN ( '%', '_' ) SET @min_len = @min_len + 1 IF @is_char_phrase = 0 AND @loop_chr NOT IN ( '%', '_', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' ) SET @is_char_phrase = 1 SET @loop_idx = @loop_idx + 1 END CREATE TABLE #tbl_res ( SchemaName SYSNAME NOT NULL, TableName SYSNAME NOT NULL, ColumnName SYSNAME NOT NULL, Id INT NULL, ColumnValue NVARCHAR(max) NOT NULL ); CREATE TABLE #tbl_res2 ( SchemaName SYSNAME NOT NULL, TableName SYSNAME NOT NULL, ColumnName SYSNAME NOT NULL, Id INT NULL, ColumnValue NVARCHAR(max) NOT NULL ); DECLARE crr CURSOR local fast_forward FOR SELECT s.NAME AS SchemaName, t.NAME AS TableName, c.NAME AS ColumnName, 1 AS id_present FROM sys.objects t INNER JOIN sys.syscolumns c ON c.id = t.object_id INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id WHERE t.type = 'U' AND c.status&0x80 = 0 -- Not IDENTITY AND EXISTS (SELECT * FROM syscolumns c2 WHERE t.object_id = c2.id AND c2.status&0x80 = 0x80 AND c2.xtype IN ( 48, 52, 56 )) AND ( ( @is_char_phrase = 1 AND c.xtype IN ( 175, 239, 99, 231, 35, 167 ) AND c.length >= @min_len ) -- char only OR ( @is_char_phrase = 0 AND c.xtype NOT IN ( 34, 165, 173, 189, 61, 58, 36 ) ) ) -- char and numeric UNION SELECT s.name, t.name, c.name, 0 FROM sys.objects t INNER JOIN sys.syscolumns c ON c.id = t.object_id INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id WHERE t.type = 'U' AND NOT EXISTS (SELECT * FROM syscolumns c2 WHERE t.object_id = c2.id AND c2.status&0x80 = 0x80 AND c2.xtype IN ( 48, 52, 56 )) AND ( ( @is_char_phrase = 1 AND c.xtype IN ( 175, 239, 99, 231, 35, 167 ) AND c.length >= @min_len ) -- char only OR ( @is_char_phrase = 0 AND c.xtype NOT IN ( 34, 165, 173, 189, 61, 58, 36 ) ) ) -- char and numeric ORDER BY 1, 2; OPEN crr FETCH crr INTO @schema, @tbl, @col, @id_present WHILE @@FETCH_STATUS = 0 BEGIN IF @OutFullRecords = 0 BEGIN SET @sql = 'insert into #tbl_res (SchemaName, TableName, ColumnName, Id, ColumnValue) ' + 'select ''[' + @schema + ']'', ''[' + @tbl + ']'', ''[' + @col + ']'', ' IF @id_present = 1 SET @sql = @sql + 'IDENTITYCOL, ' ELSE SET @sql = @sql + 'NULL, ' SET @sql = @sql + 'convert(NVARCHAR(MAX), [' + @col + ']) ' + 'from [' + @schema + '].[' + @tbl + '] (nolock) ' + 'where convert(varchar(8000), [' + @col + ']) like ''' + @phrase + ''' ' END IF @OutFullRecords = 1 BEGIN SET @sql = 'if exists (select * from [' + @tbl + '] (nolock) ' + 'where convert(varchar(8000), [' + @col + ']) like ''' + @phrase + ''') ' + 'select ''[' + @tbl + ']'' TableName, ''[' + @col + ']'' ColumnName, * ' + 'from [' + @tbl + '] (nolock) where convert(varchar(8000), [' + @col + ']) like ''' + @phrase + ''';' END EXEC(@sql); FETCH crr INTO @schema, @tbl, @col, @id_present; END CLOSE crr; DEALLOCATE crr; IF @OutFullRecords = 0 BEGIN INSERT #tbl_res2 SELECT SchemaName, TableName, ColumnName, Id, CONVERT(VARCHAR(255), ColumnValue) ColumnValue FROM #tbl_res; END SELECT SchemaName, TableName, ColumnName, ColumnValue FROM #tbl_res2 GROUP BY SchemaName, TableName, ColumnName, ColumnValue ORDER BY SchemaName, TableName; GO