如何在 SQL 数据库的任何列中找到特定字符?
How do I find a certain character in any column across an SQL database?
我们最近发现我们的数据已被某处的某些编辑器损坏(并且我们的后端没有在进入途中对其进行过滤...是的,我们应该解决这个问题)。具体来说,我们在几个地方发现了删除字符 (0x007f
)。
到目前为止,我们已经能够通过在它破坏某些东西时找到它们来定位它们,然后在出现的地方看看有没有更多
有没有办法进行数据库范围的查询,以显示我们需要遍历数据并清理数据的所有表和列?
在伪代码中,我正在寻找等同于
的东西
SELECT theTable, theColumn
FROM entire database
WHERE for any row in theTable, theColumn matches LIKE '%%' -- DEL char between %'s
你可以试试这个
DECLARE
@search_string VARCHAR(100),
@table_name SYSNAME,
@table_id INT,
@column_name SYSNAME,
@sql_string VARCHAR(2000)
SET @search_string = 'StringtoSearch'
DECLARE tables_cur CURSOR FOR SELECT name, object_id FROM sys.objects WHERE type = 'U'
OPEN tables_cur
FETCH NEXT FROM tables_cur INTO @table_name, @table_id
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE columns_cur CURSOR FOR SELECT name FROM sys.columns WHERE object_id = @table_id AND system_type_id IN (167, 175, 231, 239)
OPEN columns_cur
FETCH NEXT FROM columns_cur INTO @column_name
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @sql_string = 'IF EXISTS (SELECT * FROM ' + @table_name + ' WHERE [' + @column_name + '] LIKE ''%' + @search_string + '%'') PRINT ''' + @table_name + ', ' + @column_name + ''''
EXECUTE(@sql_string)
FETCH NEXT FROM columns_cur INTO @column_name
END
CLOSE columns_cur
DEALLOCATE columns_cur
FETCH NEXT FROM tables_cur INTO @table_name, @table_id
END
CLOSE tables_cur
DEALLOCATE tables_cur
我们最近发现我们的数据已被某处的某些编辑器损坏(并且我们的后端没有在进入途中对其进行过滤...是的,我们应该解决这个问题)。具体来说,我们在几个地方发现了删除字符 (0x007f
)。
到目前为止,我们已经能够通过在它破坏某些东西时找到它们来定位它们,然后在出现的地方看看有没有更多
有没有办法进行数据库范围的查询,以显示我们需要遍历数据并清理数据的所有表和列?
在伪代码中,我正在寻找等同于
的东西SELECT theTable, theColumn
FROM entire database
WHERE for any row in theTable, theColumn matches LIKE '%%' -- DEL char between %'s
你可以试试这个
DECLARE
@search_string VARCHAR(100),
@table_name SYSNAME,
@table_id INT,
@column_name SYSNAME,
@sql_string VARCHAR(2000)
SET @search_string = 'StringtoSearch'
DECLARE tables_cur CURSOR FOR SELECT name, object_id FROM sys.objects WHERE type = 'U'
OPEN tables_cur
FETCH NEXT FROM tables_cur INTO @table_name, @table_id
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE columns_cur CURSOR FOR SELECT name FROM sys.columns WHERE object_id = @table_id AND system_type_id IN (167, 175, 231, 239)
OPEN columns_cur
FETCH NEXT FROM columns_cur INTO @column_name
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @sql_string = 'IF EXISTS (SELECT * FROM ' + @table_name + ' WHERE [' + @column_name + '] LIKE ''%' + @search_string + '%'') PRINT ''' + @table_name + ', ' + @column_name + ''''
EXECUTE(@sql_string)
FETCH NEXT FROM columns_cur INTO @column_name
END
CLOSE columns_cur
DEALLOCATE columns_cur
FETCH NEXT FROM tables_cur INTO @table_name, @table_id
END
CLOSE tables_cur
DEALLOCATE tables_cur