Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Search for a string in all tables, rows and columns of a DB

I am lost in a big database and I am not able to find where the data I get comes from. I was wondering if it is possible with SQL Server 2005 to search for a string in all tables, rows and columns of a database?

Does anybody has an idea if it is possible and how?

like image 546
Martin Avatar asked Feb 26 '09 18:02

Martin


People also ask

How do I search for a string in an entire database in SQL Server?

If you need to find database objects (e.g. tables, columns, and triggers) by name - have a look at the free Redgate Software tool called SQL Search which does this - it searches your entire database for any kind of string(s).


1 Answers

This code should do it in SQL 2005, but a few caveats:

  1. It is RIDICULOUSLY slow. I tested it on a small database that I have with only a handful of tables and it took many minutes to complete. If your database is so big that you can't understand it then this will probably be unusable anyway.

  2. I wrote this off the cuff. I didn't put in any error handling and there might be some other sloppiness especially since I don't use cursors often. For example, I think there's a way to refresh the columns cursor instead of closing/deallocating/recreating it every time.

If you can't understand the database or don't know where stuff is coming from, then you should probably find someone who does. Even if you can find where the data is, it might be duplicated somewhere or there might be other aspects of the database that you don't understand. If no one in your company understands the database then you're in a pretty big mess.

DECLARE     @search_string  VARCHAR(100),     @table_name     SYSNAME,     @table_schema   SYSNAME,     @column_name    SYSNAME,     @sql_string     VARCHAR(2000)  SET @search_string = 'Test'  DECLARE tables_cur CURSOR FOR SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'  OPEN tables_cur  FETCH NEXT FROM tables_cur INTO @table_schema, @table_name  WHILE (@@FETCH_STATUS = 0) BEGIN     DECLARE columns_cur CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @table_schema AND TABLE_NAME = @table_name AND COLLATION_NAME IS NOT NULL  -- Only strings have this and they always have it      OPEN columns_cur      FETCH NEXT FROM columns_cur INTO @column_name     WHILE (@@FETCH_STATUS = 0)     BEGIN         SET @sql_string = 'IF EXISTS (SELECT * FROM ' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ' WHERE ' + QUOTENAME(@column_name) + ' LIKE ''%' + @search_string + '%'') PRINT ''' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ', ' + QUOTENAME(@column_name) + ''''          EXECUTE(@sql_string)          FETCH NEXT FROM columns_cur INTO @column_name     END      CLOSE columns_cur      DEALLOCATE columns_cur      FETCH NEXT FROM tables_cur INTO @table_schema, @table_name END  CLOSE tables_cur  DEALLOCATE tables_cur 
like image 103
Tom H Avatar answered Oct 06 '22 12:10

Tom H