segunda-feira, 6 de agosto de 2012

A "Super Query"

Fui consultado hoje, por uma solicitação inusitada. Localizar em qualquer campo de qualquer tabela de qualquer banco de uma instância SQL 2005, por um determinado valor. Como se tratava de uma questão pontual, o FULL TEXT seria um pouco excessico, algo como um canhão para matar uma formiguinha. Então decidi procurar algo no amigo google antes de sair desenvolvendo a roda quadrada. Eis que localizei no StackOverflow algo adequado a minha necessidade, que um colega de trabalho apelidou de SUPER QUERY. Veja o script abaixo:


DECLARE

    @search_string      VARCHAR(100),

    @table_name         SYSNAME,

    @table_id           INT,

    @column_name        SYSNAME,

    @sql_string         VARCHAR(2000)


SET @search_string = 'Test'


DECLARE tables_cur CURSOR FOR SELECT name, object_id FROM sys.objects WHERE type = 'U'


OPEN tables_cur


FETCH NEXT FROM tables_cur INTO @table_name, @table_id


WHILE (@@FETCH_STATUS = 0)

BEGIN

    DECLARE columns_cur CURSOR FOR SELECT name FROM sys.columns WHERE object_id = @table_id AND system_type_id IN (167, 175, 231, 239)


    OPEN columns_cur


    FETCH NEXT FROM columns_cur INTO @column_name

    WHILE (@@FETCH_STATUS = 0)

    BEGIN

        SET @sql_string = 'IF EXISTS (SELECT * FROM ' + @table_name + ' WHERE ' + @column_name + ' LIKE ''%' + @search_string + '%'') PRINT ''' + @table_name + ', ' + @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_name, @table_id

END


CLOSE tables_cur


DEALLOCATE tables_cur


Eis o link para o original: http://stackoverflow.com/questions/591853/search-for-a-string-in-an-all-the-tables-rows-and-columns-of-a-db

Nenhum comentário:

Postar um comentário

Leave your comment here!