sql >> Database >  >> RDS >> Sqlserver

Zoek naar een string in alle tabellen, rijen en kolommen van een DB

Deze code zou het moeten doen in SQL 2005, maar een paar kanttekeningen:

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

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


  1. Hoe maak je een rustgevende wachtwoordherinnering en verander je het e-mailadres van de gebruiker in het gebruikersnaamveld met Laravel 5.0?

  2. Zorg ervoor dat PostgreSQL soms een slecht queryplan kiest

  3. Voorwaardelijke lead/lag-functie PostgreSQL?

  4. Gridview-kolomkop maken door gegevens uit de database te laden