Deze code zou het moeten doen in SQL 2005, maar een paar kanttekeningen:
-
Het is RIDICUULUS traag. Ik heb het getest op een kleine database die ik heb met slechts een handvol tabellen en het duurde vele minuten om te voltooien. Als uw database zo groot is dat u deze niet kunt begrijpen, is deze waarschijnlijk toch onbruikbaar.
-
Ik heb dit uit de losse pols geschreven. Ik heb geen foutafhandeling ingevoerd en er kan een andere slordigheid zijn, vooral omdat ik cursors niet vaak gebruik. Ik denk bijvoorbeeld dat er een manier is om de kolomcursor te vernieuwen in plaats van deze elke keer te sluiten/dealloceren/opnieuw aan te maken.
Als je de database niet begrijpt of niet weet waar dingen vandaan komen, dan zou je waarschijnlijk iemand moeten zoeken die dat wel kan. Zelfs als u kunt vinden waar de gegevens zich bevinden, kunnen deze ergens worden gedupliceerd of zijn er andere aspecten van de database die u niet begrijpt. Als niemand in uw bedrijf de database begrijpt, zit u in een behoorlijk grote puinhoop.
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