Tuesday, 10 May 2011

SQL Search for a String in all Tables

Declare @TN as varchar(200), @CN as varchar(200), @myValue varchar(30), @SQL as nvarchar(1000) 
, @SN as varchar(200), @Exact_Match bit 
  
Create Table #myTable (Table_Name varchar(200), Column_Name varchar(200), Number_Of_Rows int) 
  
-- Replace @myValue with the value you're searching for in the database 
Set @myValue = 'mySearchValue'  
-- 0 for LIKE match, 1 for exact match 
Set @Exact_Match = 0     
  
Declare myCursor Cursor For 
Select T.Table_Name, C.Column_Name, T.Table_Schema 
From INFORMATION_SCHEMA.TABLES T Inner Join INFORMATION_SCHEMA.COLUMNS C  
On T.Table_Schema = C.Table_Schema And T.Table_Name = C.Table_Name 
Where T.Table_Name Not In ('dtproperties') And Table_Type = 'Base Table' 
And C.Data_Type In ('varchar','char','nvarchar','nchar','sql_variant') 
--And C.Data_Type In ('text','ntext') 
--And C.Data_Type In ('tinyint','int','bigint','numeric','decimal','money','float','smallint','real','smallmoney') 
--And C.Data_Type In ('datetime','dmalldatetime') 
-- Fields not searched: image, uniqueidentifier, bit, varbinary, binary, timestamp 
Open myCursor 
Fetch Next From myCursor Into @TN, @CN, @SN 
While @@Fetch_Status <> -1 
Begin 
        If @Exact_Match = 0 
                Set @SQL = N'Insert Into #myTable Select ''' + @SN + '.' + @TN + ''', ''' + @CN + ''', Count(*) From [' + @SN + '].[' + @TN + '] Where [' + @CN + '] Like ''%' + @myValue + '%''' 
            Else 
                Set @SQL = N'Insert Into #myTable Select ''' + @SN + '.' + @TN + ''', ''' + @CN + ''', Count(*) From [' + @SN + '].[' + @TN + '] Where [' + @CN + '] = ''' + @myValue + '''' 
        --Print @SQL 
        Exec sp_executesql @SQL  
        Fetch Next From myCursor Into @TN, @CN, @SN 
End 
Close myCursor 
Deallocate myCursor 
Select * From #myTable Where Number_Of_Rows > 0 Order By Table_Name 
Drop Table #myTable

No comments:

Post a Comment