Este código debería hacerlo en SQL 2005, pero algunas advertencias:
-
Es RIDÍCULAMENTE lento. Lo probé en una pequeña base de datos que tengo con solo un puñado de tablas y tardé muchos minutos en completarlo. Si su base de datos es tan grande que no puede entenderla, probablemente no se podrá utilizar de todos modos.
-
Escribí esto de improviso. No puse ningún manejo de errores y puede haber algún otro descuido, especialmente porque no uso los cursores con frecuencia. Por ejemplo, creo que hay una forma de actualizar el cursor de las columnas en lugar de cerrarlo, desasignarlo o volver a crearlo cada vez.
Si no puede entender la base de datos o no sabe de dónde provienen las cosas, entonces probablemente debería encontrar a alguien que lo haga. Incluso si puede encontrar dónde están los datos, es posible que estén duplicados en alguna parte o que haya otros aspectos de la base de datos que no comprenda. Si nadie en su empresa entiende la base de datos, entonces está en un gran lí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