sql >> Base de Datos >  >> RDS >> Sqlserver

Busque una cadena en todas las tablas, filas y columnas de un DB

Este código debería hacerlo en SQL 2005, pero algunas advertencias:

  1. Es RIDÍCULAMENTE lento. Lo probé en una pequeña base de datos que tengo con solo un puñado de tablas y tardé muchos minutos en completarlo. Si su base de datos es tan grande que no puede entenderla, probablemente no se podrá utilizar de todos modos.

  2. Escribí esto de improviso. No puse ningún manejo de errores y puede haber algún otro descuido, especialmente porque no uso los cursores con frecuencia. Por ejemplo, creo que hay una forma de actualizar el cursor de las columnas en lugar de cerrarlo, desasignarlo o volver a crearlo cada vez.

Si no puede entender la base de datos o no sabe de dónde provienen las cosas, entonces probablemente debería encontrar a alguien que lo haga. Incluso si puede encontrar dónde están los datos, es posible que estén duplicados en alguna parte o que haya otros aspectos de la base de datos que no comprenda. Si nadie en su empresa entiende la base de datos, entonces está en un gran lío.

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