Ce code devrait le faire dans SQL 2005, mais quelques mises en garde :
-
C'est RIDICULEUSEMENT lent. Je l'ai testé sur une petite base de données que j'ai avec seulement une poignée de tables et cela a pris plusieurs minutes. Si votre base de données est si volumineuse que vous ne pouvez pas la comprendre, elle sera probablement inutilisable de toute façon.
-
J'ai écrit ça au pied levé. Je n'ai ajouté aucune gestion des erreurs et il pourrait y avoir d'autres négligences, d'autant plus que je n'utilise pas souvent les curseurs. Par exemple, je pense qu'il existe un moyen d'actualiser le curseur des colonnes au lieu de le fermer/désallouer/recréer à chaque fois.
Si vous ne pouvez pas comprendre la base de données ou si vous ne savez pas d'où viennent les éléments, vous devriez probablement trouver quelqu'un qui le comprend. Même si vous pouvez trouver où se trouvent les données, elles peuvent être dupliquées quelque part ou il peut y avoir d'autres aspects de la base de données que vous ne comprenez pas. Si personne dans votre entreprise ne comprend la base de données, vous êtes dans un sacré pétrin.
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