Questo codice dovrebbe farlo in SQL 2005, ma alcuni avvertimenti:
-
È RIDICOLOSAMENTE lento. L'ho testato su un piccolo database che ho con solo una manciata di tabelle e ci sono voluti molti minuti per completarlo. Se il tuo database è così grande che non riesci a capirlo, probabilmente sarà comunque inutilizzabile.
-
L'ho scritto a braccio. Non ho inserito alcuna gestione degli errori e potrebbe esserci qualche altra sciatteria soprattutto perché non uso spesso i cursori. Ad esempio, penso che ci sia un modo per aggiornare il cursore delle colonne invece di chiuderlo/deallocare/ricrearlo ogni volta.
Se non riesci a capire il database o non sai da dove provengono le cose, probabilmente dovresti trovare qualcuno che lo fa. Anche se riesci a trovare dove si trovano i dati, potrebbero essere duplicati da qualche parte o potrebbero esserci altri aspetti del database che non capisci. Se nessuno nella tua azienda comprende il database, allora sei in un bel pasticcio.
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