Поиск определенного термина / значения в каждом поле базы данных - PullRequest
0 голосов
/ 26 октября 2018

Цель того, что я делаю, - включить сценарий, который при запуске будет показывать каждый экземпляр указанного термина в любом месте базы данных.

У меня есть сценарий, который был создан для отображенияэкземпляры определенного термина в указанной таблице.Я расширил сценарий с помощью курсора, который сначала будет индексировать базу данных для каждого отдельного имени таблицы, а затем выполнить запрос, показывая все данные в строке для каждой таблицы, в которой найден термин.Например, если вы хотите искать экземпляры термина «алюминий» или «свинец» в глобальном масштабе, значение @stringtofind = 'aluminium' должно в любое время показывать, что точный термин использовался где-либо, или в дальнейшем будет отображаться «% lead%».экземпляры этого слова в качестве поля или других терминов, содержащих это слово.

Это работает, однако, лучшая версия этого будет получать результаты в одном запросе, а не множество запросов, которые выполняются,так как это может быть непомерно, а также немного затрудняет анализ данных.

В идеале я бы хотел вместо одного запроса, который имеет три столбца, таких как:

TableName, ColumnName, FieldContainedSpecifiedTerm

Я думаю, я мог бы сделать это намного проще, если бы я мог объединить содержимое двух столбцов в один столбец.Concat и Union строго запрещены из-за влияния, соответственно, создания массивного конкатата, в котором результат может содержать данные, о которых идет речь, но быстро теряет ценность после объединения, а также из-за таких вещей, как требование того же количества полей для созданияобъединение.

Я считаю, что если бы можно было использовать приведение или преобразование, если для одного столбца за раз поле было изменено на что-то вроде VARCHAR 100 или на аналогичный тип данных типа all или close на всеохватывающийнапример, преобразовать все данные в столбце в текстовое поле длиной в сто или более символов, развернуть каждую строку в фиктивном столбце, затем перейти к следующему столбцу и повторить.Это может быть повторено для каждого столбца в таблице, и затем что-то, например, курсор, может перейти к следующей таблице в списке и повторить, где конечным результатом является буквально каждая строка вашей базы данных в одном столбце.

Если это возможно, можно использовать простое предложение where для поиска необходимой информации, а также, если в строке также есть дополнительные столбцы, обозначающие идентичность и источник результата, это может помочь отследить записи конкретных терминов везде, где онипоявились.

Это скрипт, который у меня сейчас есть:

--This will list each instance of a field with the data "sample" in it
DECLARE @stringtofind VARCHAR(100)= 'sample', @schema SYSNAME= 'dbo', @table SYSNAME;
DECLARE @sqlCommand VARCHAR(8000);
DECLARE @where VARCHAR(8000);
DECLARE @columnName SYSNAME;
DECLARE @cursor VARCHAR(8000);
DECLARE TableList CURSOR
FOR SELECT DISTINCT
           o.name
    FROM sys.columns c
         JOIN sys.types t ON c.user_type_id = t.user_type_id
         JOIN sys.objects o ON c.object_id = o.object_id
         JOIN sys.schemas s ON o.schema_id = s.schema_id
    WHERE c.name LIKE '%'
          AND o.type_desc = 'user_table'
    ORDER BY name;
OPEN TableList;
FETCH NEXT FROM TableList INTO @table;
WHILE @@FETCH_STATUS = 0
    BEGIN
        BEGIN TRY
            SET @sqlCommand = 'SELECT * FROM ['+@schema+'].['+@table+'] WHERE';
            SET @where = '';
            SET @cursor = 'DECLARE col_cursor CURSOR FOR SELECT COLUMN_NAME
   FROM '+DB_NAME()+'.INFORMATION_SCHEMA.COLUMNS
   WHERE TABLE_SCHEMA = '''+@schema+'''
   AND TABLE_NAME = '''+@table+'''
   AND DATA_TYPE IN (''char'',''nchar'',''ntext'',''nvarchar'',''text'',''varchar'')';
            EXEC (@cursor);
            OPEN col_cursor;
            FETCH NEXT FROM col_cursor INTO @columnName;
            WHILE @@FETCH_STATUS = 0
                BEGIN
                    IF @where <> ''
                        SET @where = @where+' OR';
                    SET @where = @where+' ['+@columnName+'] LIKE '''+@stringToFind+'''';
                    FETCH NEXT FROM col_cursor INTO @columnName;
                END;
            CLOSE col_cursor;
            DEALLOCATE col_cursor;
            SET @sqlCommand = @sqlCommand + @where;
            PRINT @sqlCommand;
            EXEC (@sqlCommand);
        END TRY
        BEGIN CATCH
            PRINT 'There was an error. Check to make sure object exists.';
            PRINT ERROR_MESSAGE();
            IF CURSOR_STATUS('variable', 'col_cursor') <> -3
                BEGIN
                    CLOSE col_cursor;
                    DEALLOCATE col_cursor;
                END;
        END CATCH;
        FETCH NEXT FROM TableList INTO @table;
    END;
CLOSE TableList;
DEALLOCATE TableList;
GO
...