Цель того, что я делаю, - включить сценарий, который при запуске будет показывать каждый экземпляр указанного термина в любом месте базы данных.
У меня есть сценарий, который был создан для отображенияэкземпляры определенного термина в указанной таблице.Я расширил сценарий с помощью курсора, который сначала будет индексировать базу данных для каждого отдельного имени таблицы, а затем выполнить запрос, показывая все данные в строке для каждой таблицы, в которой найден термин.Например, если вы хотите искать экземпляры термина «алюминий» или «свинец» в глобальном масштабе, значение @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