Este código deve fazer isso no SQL 2005, mas algumas ressalvas:
-
É RIDICULAMENTE lento. Eu testei em um pequeno banco de dados que tenho com apenas um punhado de tabelas e levou muitos minutos para ser concluído. Se o seu banco de dados é tão grande que você não consegue entendê-lo, então isso provavelmente será inutilizável de qualquer maneira.
-
Eu escrevi isso de improviso. Eu não coloquei nenhum tratamento de erro e pode haver algum outro desleixo, especialmente porque não uso cursores com frequência. Por exemplo, acho que há uma maneira de atualizar o cursor das colunas em vez de fechá-lo/desalocar/recriá-lo sempre.
Se você não consegue entender o banco de dados ou não sabe de onde as coisas estão vindo, então você provavelmente deve encontrar alguém que entenda. Mesmo que você consiga descobrir onde estão os dados, eles podem estar duplicados em algum lugar ou pode haver outros aspectos do banco de dados que você não entende. Se ninguém em sua empresa entende o banco de dados, então você está em uma grande confusão.
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