我有一个庞大的架构,有数百个表和数千个列。我知道一个特定的 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'
等等