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

Søg efter en streng i alle tabeller, rækker og kolonner i en DB

Denne kode burde gøre det i SQL 2005, men nogle få forbehold:

  1. Det er LATTERLIGT langsomt. Jeg testede det på en lille database, som jeg kun har med en håndfuld tabeller, og det tog mange minutter at gennemføre. Hvis din database er så stor, at du ikke kan forstå den, vil denne sandsynligvis være ubrugelig alligevel.

  2. Jeg skrev dette af manchetten. Jeg har ikke indført nogen fejlhåndtering, og der kan være noget andet sjusk, især da jeg ikke bruger markører ofte. For eksempel tror jeg, at der er en måde at opdatere kolonnemarkøren på i stedet for at lukke/afallokere/genskabe den hver gang.

Hvis du ikke kan forstå databasen eller ikke ved, hvor ting kommer fra, så skal du nok finde nogen, der gør det. Selvom du kan finde, hvor dataene er, kan det være duplikeret et eller andet sted, eller der kan være andre aspekter af databasen, som du ikke forstår. Hvis ingen i din virksomhed forstår databasen, er du i et ret stort rod.

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. Hvordan kan jeg vise prognoseårsdata fra række til kolonne?

  2. MySQL VARCHAR lignende datatype med MIN og MAX tegnlængder

  3. Oracle til PostgreSQL — Markører og ltræer

  4. Tilføjelse af flere avancerede funktioner såsom administration af kategorier og afstemning om tråde og indlæg