USE DBAScriptDB GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO CREATE PROC dbo.usp_SearchTextAcrossDB @DBToSearch VARCHAR(512), @ValToFind VARCHAR(512) AS /* -------------------------------------------------------- Author : Date : Purpose : Search across all Tables/Columns in any DB for a text value. Wildcards may be used in @ValToFind. DB(s) : DBAScriptDB, all DBs Modification History Date Programmer Description -------- ------------- ---------------- */ --------------------------------------------------------- SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SET NOCOUNT ON DECLARE @errTxt VARCHAR(256), @objName VARCHAR(192), @own VARCHAR(384), @tbl VARCHAR(384), @col VARCHAR(384), @sqlSrch VARCHAR(8000), @sqlFld VARCHAR(8000) CREATE TABLE #Results ( Table_Name VARCHAR(384), Column_Name VARCHAR(384), Occurrence_Count INT ) CREATE TABLE #TblFlds ( TblOwner VARCHAR(384), TblName VARCHAR(384), ColName VARCHAR(384) ) SELECT @objName = 'dbo.usp_SearchTextAcrossDB' SELECT @sqlFld = 'INSERT INTO #TblFlds (TblOwner, TblName, ColName)' + CHAR(10) + ' SELECT u.name, o.name, ''['' + c.name + '']''' + CHAR(10) + ' FROM ' + @DBToSearch + '.dbo.syscolumns c (NOLOCK)' + CHAR(10) + ' INNER JOIN ' + @DBToSearch + '.dbo.sysobjects o (NOLOCK) ON c.id = o.id' + CHAR(10) + ' INNER JOIN ' + @DBToSearch + '.dbo.sysusers u (NOLOCK) ON o.uid = u.uid' + CHAR(10) + ' INNER JOIN ' + @DBToSearch + '.dbo.systypes t (NOLOCK) ON c.xusertype = t.xusertype' + CHAR(10) + ' WHERE o.type = ''U''' + CHAR(10) + ' AND (t.name = ''varchar'' OR t.name = ''char'' OR t.name = ''nvarchar'' OR t.name = ''nchar'' OR t.name = ''text'' OR t.name = ''ntext'' OR t.name = ''sysname'')' + CHAR(10) + ' ORDER BY 1, 2' EXEC (@sqlFld) WHILE EXISTS (SELECT TblOwner FROM #TblFlds) BEGIN SELECT @own = (SELECT TOP 1 TblOwner FROM #TblFlds) SELECT @tbl = (SELECT TOP 1 TblName FROM #TblFlds WHERE TblOwner = @own) SELECT @col = (SELECT TOP 1 ColName FROM #TblFlds WHERE TblOwner = @own AND TblName = @tbl) DELETE #TblFlds WHERE TblOwner = @own AND TblName = @tbl AND ColName = @col IF @col IS NOT NULL BEGIN SET @sqlSrch = 'SELECT ''' + @own + '.' + @tbl + ''', ''' + @col + ''', COUNT(*) FROM ' + @DBToSearch + '.' + @own + '.' + @tbl + ' (NOLOCK) WHERE ' + @col + ' LIKE ''' + @ValToFind + '''' INSERT INTO #Results (Table_Name, Column_Name, Occurrence_Count) EXEC (@sqlSrch) END IF (SELECT COUNT(TblOwner) FROM #TblFlds) <= 0 BREAK END IF @@ERROR <> 0 BEGIN SET @errTxt = 'Exception: ' + @objName + ' occured in SELECT Statement' RAISERROR(@errTxt, 1, 2) END SELECT Table_Name, Column_Name, Occurrence_Count FROM #Results WHERE Occurrence_Count > 0 ORDER BY 1 DROP TABLE #TblFlds, #Results GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
Friday, April 3, 2009
Searching for a peice of text across a DB
Awhile back I had the need to search for a specific peice of text across a database. After playing with the code I came up with the below stored proc. I placed the SP in our "Scripting/Administation" DB. It takes a param of database & the value to find, you can use wildcards in the value to find. The SP returns the table, column & number of occurences of the searched value.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment