Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wyszukaj ciąg we wszystkich tabelach, wierszach i kolumnach bazy danych

Ten kod powinien zrobić to w SQL 2005, ale z kilkoma zastrzeżeniami:

  1. Jest śmiesznie powolny. Przetestowałem go na małej bazie danych, którą mam tylko z kilkoma tabelami i ukończenie zajęło wiele minut. Jeśli Twoja baza danych jest tak duża, że ​​nie możesz jej zrozumieć, prawdopodobnie i tak będzie bezużyteczna.

  2. Spisałem to z mankietu. Nie wprowadziłem żadnej obsługi błędów i może być jakaś inna niechlujność, zwłaszcza że nie używam często kursorów. Na przykład myślę, że istnieje sposób na odświeżenie kursora kolumn zamiast zamykania/cofania przydziału/odtwarzania go za każdym razem.

Jeśli nie możesz zrozumieć bazy danych lub nie wiesz, skąd pochodzą rzeczy, prawdopodobnie powinieneś znaleźć kogoś, kto to rozumie. Nawet jeśli możesz znaleźć, gdzie są dane, mogą być gdzieś zduplikowane lub mogą istnieć inne aspekty bazy danych, których nie rozumiesz. Jeśli nikt w Twojej firmie nie rozumie bazy danych, jesteś w dość dużym bałaganie.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 sposoby na zliczanie liczby tabel systemowych w bazie danych SQL Server

  2. Zbieranie danych o wydajności za pomocą narzędzia SQLDiag | Rozwiązywanie problemów z wydajnością serwera SQL -6

  3. Polecenie uśpienia w T-SQL?

  4. Czy istnieje sposób na uzyskanie listy wszystkich aktualnych tabel tymczasowych w SQL Server?

  5. Jakie jest zastosowanie GO w SQL Server Management Studio i Transact SQL?