Този код трябва да го направи в SQL 2005, но няколко предупреждения:
-
СМЕШНО е бавен. Тествах го върху малка база данни, която имам само с няколко таблици и отне много минути, за да завърши. Ако вашата база данни е толкова голяма, че не можете да я разберете, тогава това вероятно ще бъде неизползваемо така или иначе.
-
Написах това направо. Не съм въвел обработка на грешки и може да има някаква друга небрежност, особено след като не използвам курсори често. Например, мисля, че има начин да опресните курсора на колоните, вместо да го затваряте/освобождавате/създавате отново всеки път.
Ако не можете да разберете базата данни или не знаете откъде идват нещата, вероятно трябва да намерите някой, който знае. Дори и да можете да намерите къде са данните, те може да са дублирани някъде или може да има други аспекти на базата данни, които не разбирате. Ако никой във вашата компания не разбира базата данни, значи сте в доста голяма бъркотия.
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