Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Cerca una stringa in tutte le tabelle, righe e colonne di un DB

Questo codice dovrebbe farlo in SQL 2005, ma alcuni avvertimenti:

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

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