我有一个庞大的架构,有数百个表和数千列.我知道一个特定的IP地址存储在这个数据库中的几个地方,但是我不确定它存储在哪个表或列中.基本上,我试图在任何地方找到这个IP地址存储在DB中,因此我可以将其更新为所有这些位置的新值.
这是我在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'
等等