Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Търсене на низ във всички таблици, редове и колони на DB

Този код трябва да го направи в SQL 2005, но няколко предупреждения:

  1. СМЕШНО е бавен. Тествах го върху малка база данни, която имам само с няколко таблици и отне много минути, за да завърши. Ако вашата база данни е толкова голяма, че не можете да я разберете, тогава това вероятно ще бъде неизползваемо така или иначе.

  2. Написах това направо. Не съм въвел обработка на грешки и може да има някаква друга небрежност, особено след като не използвам курсори често. Например, мисля, че има начин да опресните курсора на колоните, вместо да го затваряте/освобождавате/създавате отново всеки път.

Ако не можете да разберете базата данни или не знаете откъде идват нещата, вероятно трябва да намерите някой, който знае. Дори и да можете да намерите къде са данните, те може да са дублирани някъде или може да има други аспекти на базата данни, които не разбирате. Ако никой във вашата компания не разбира базата данни, значи сте в доста голяма бъркотия.

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. Максимално реално пространство във varbinary(max) в SQL Server

  2. System.Data.SqlClient.SqlException:Неправилен синтаксис близо до '='

  3. Заявка за динамично свързан сървър

  4. Неочаквано поведение @@rowcount в UDF в MS SQL 2019

  5. Как да върнете стойността на ASCII кода за даден знак в SQL Server