Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Procure uma string em todas as tabelas, linhas e colunas de um banco de dados


Este código deve fazer isso no SQL 2005, mas algumas ressalvas:

  1. É RIDICULAMENTE lento. Eu testei em um pequeno banco de dados que tenho com apenas um punhado de tabelas e levou muitos minutos para ser concluído. Se o seu banco de dados é tão grande que você não consegue entendê-lo, então isso provavelmente será inutilizável de qualquer maneira.

  2. Eu escrevi isso de improviso. Eu não coloquei nenhum tratamento de erro e pode haver algum outro desleixo, especialmente porque não uso cursores com frequência. Por exemplo, acho que há uma maneira de atualizar o cursor das colunas em vez de fechá-lo/desalocar/recriá-lo sempre.

Se você não consegue entender o banco de dados ou não sabe de onde as coisas estão vindo, então você provavelmente deve encontrar alguém que entenda. Mesmo que você consiga descobrir onde estão os dados, eles podem estar duplicados em algum lugar ou pode haver outros aspectos do banco de dados que você não entende. Se ninguém em sua empresa entende o banco de dados, então você está em uma grande confusã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