sql >> Databasteknik >  >> RDS >> Sqlserver

Sök efter en sträng i alla tabeller, rader och kolumner i en DB

Den här koden bör göra det i SQL 2005, men några varningar:

  1. Det är LÖJLIGT långsamt. Jag testade det på en liten databas som jag har med bara en handfull tabeller och det tog många minuter att slutföra. Om din databas är så stor att du inte kan förstå den kommer denna förmodligen att vara oanvändbar ändå.

  2. Jag skrev detta av manschetten. Jag lade inte in någon felhantering och det kan vara lite annat slarv speciellt eftersom jag inte använder markörer ofta. Till exempel tror jag att det finns ett sätt att uppdatera kolumnmarkören istället för att stänga/avallokera/återskapa den varje gång.

Om du inte kan förstå databasen eller inte vet var saker kommer ifrån, bör du förmodligen hitta någon som gör det. Även om du kan hitta var data finns, kan den dupliceras någonstans eller så kan det finnas andra aspekter av databasen som du inte förstår. Om ingen i ditt företag förstår databasen är du i en ganska stor röra.

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. SQL Server AlwaysOn Availability Groups:Installation och konfiguration, del 1

  2. MySQL exempeldatabas

  3. Hur ser man resultat/utdata för återkurs i Oracle SQL Developer?

  4. mysqli eller PDO - vilka är för- och nackdelarna?