У меня есть огромная схема с несколькими сотнями таблиц и несколькими тысячами столбцов. Я бы знал, что определенный IP-адрес хранится в этой базе данных в нескольких местах, но я не уверен, в каких таблицах или столбцах он хранится. В основном, я пытаюсь найти везде, что это IP-адрес хранится в БД, поэтому я могу обновить его до нового значения во всех этих местах.
Здесь моя первая трещина в инструкции T-SQL для печати имени таблицы и столбца и значения для каждого столбца текста в базе данных, в которой есть подстрока 10.15.13.
Теперь это работает, вроде. Проблема заключается в том, что когда я выполняю его в Management Studio, вызов sp_executesql фактически вернет все пустые результаты из каждого запроса, который ничего не возвращает (то есть в столбце нет записей с этой подстрокой), и он заполняет окно результатов до его максимального значения, а затем я действительно не вижу, было ли что-либо напечатано.
Есть ли лучший способ написать этот запрос? Или я могу запустить его каким-то другим способом, чтобы он отображал только таблицы и столбцы, где существует эта подстрока?
DECLARE
@SchemaName VARCHAR(50),
@TableName VARCHAR(50),
@ColumnName VARCHAR(50);
BEGIN
DECLARE textColumns CURSOR FOR
SELECT s.Name, tab.Name, c.Name
FROM Sys.Columns c, Sys.Types t, Sys.Tables tab, Sys.Schemas s
WHERE s.schema_id = tab.schema_id AND tab.object_id = c.object_id AND c.user_type_id = t.user_type_id
AND t.Name in ('TEXT','NTEXT','VARCHAR','CHAR','NVARCHAR','NCHAR');
OPEN textColumns
FETCH NEXT FROM textColumns
INTO @SchemaName, @TableName, @ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql NVARCHAR(MAX),
@ParamDef NVARCHAR(MAX),
@result NVARCHAR(MAX);
SET @sql = N'SELECT ' + @ColumnName + ' FROM ' + @SchemaName + '.' + @TableName + ' WHERE ' + @ColumnName + ' LIKE ''%10.15.13%''';
SET @ParamDef = N'@resultOut NVARCHAR(MAX) OUTPUT';
EXEC sp_executesql @sql, @ParamDef, @resultOut = @result OUTPUT;
PRINT 'Column = ' + @TableName + '.' + @ColumnName + ', Value = ' + @result;
FETCH NEXT FROM textColumns
INTO @SchemaName, @TableName, @ColumnName
END
CLOSE textColumns;
DEALLOCATE textColumns;
END
Я хотел бы увидеть результаты, подобные этому, где он показывает таблицу/столбец, в котором находилась подстрока, и полное значение в этом столбце...
Column = SomeTable.SomeTextColumn, Value = 'https://10.15.13.210/foo'
Column = SomeTable.SomeOtherColumn, Value = '10.15.13.210'
и др.