sql >> Databáze >  >> RDS >> Sqlserver

Vyhledejte řetězec ve všech tabulkách, řádcích a sloupcích databáze

Tento kód by to měl dělat v SQL 2005, ale několik upozornění:

  1. Je to SMĚŠNĚ pomalé. Testoval jsem to na malé databázi, kterou mám jen s hrstkou tabulek, a dokončení trvalo mnoho minut. Pokud je vaše databáze tak velká, že jí nerozumíte, bude pravděpodobně stejně nepoužitelná.

  2. Odepsal jsem to z manžety. Nezadal jsem žádné ošetření chyb a mohlo by dojít k nějaké další nedbalosti, zejména proto, že nepoužívám kurzory často. Například si myslím, že existuje způsob, jak obnovit kurzor sloupců místo jeho zavírání/dealokace/znovuvytváření pokaždé.

Pokud databázi nerozumíte nebo nevíte, odkud věci pocházejí, pak byste pravděpodobně měli najít někoho, kdo tomu rozumí. I když můžete najít, kde data jsou, mohou být někde duplikována nebo mohou existovat další aspekty databáze, kterým nerozumíte. Pokud nikdo ve vaší společnosti nerozumí databázi, pak jste v docela velkém nepořádku.

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. Jak získám názvy sloupců v Laravel 4?

  2. SQL Server:Jak volat uživatelem definovanou funkci (UDF) na propojeném serveru?

  3. Prohlášení Oracle Update s Inner Join

  4. Zabránění ukládání dotazů do mezipaměti v MySQL