Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Rechercher une chaîne dans toutes les tables, lignes et colonnes d'une base de données

Ce code devrait le faire dans SQL 2005, mais quelques mises en garde :

  1. 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.

  2. 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