【问题标题】:How do I find a certain character in any column across an SQL database?如何在 SQL 数据库的任何列中找到某个字符?
【发布时间】:2017-07-02 13:25:32
【问题描述】:

我们最近发现我们的数据已被某处的某个编辑器损坏(而且我们的后端在进入的过程中没有对其进行过滤......是的,我们应该解决这个问题)。具体来说,我们在多个地方发现了一个删除字符 (0x007f)。

到目前为止,我们已经能够通过找到它们来定位它们,当它破坏某些东西时,然后在它出现的地方执行 SELECT * WHERE [TheColumn] LIKE '%%'(是的,两个 % 符号之间有一个 DEL 字符)看看还有没有更多。

有没有办法进行数据库范围的查询,以显示我们需要遍历数据并清理数据的所有表和列?

在伪代码中,我正在寻找类似的东西

SELECT theTable, theColumn
FROM entire database
WHERE for any row in theTable, theColumn matches LIKE '%%' -- DEL char between %'s

【问题讨论】:

  • 不幸的是,这并不容易。但是,您可以做的是选择列包含 char、varchar 或 nvarchar 的所有表名和列名,然后将查询如 'SELECT COUNT(*) FROM ' + tablename + ' WHERE ' + columnname + ' LIKE ' + 字符 (39) + '%%' + 字符 (39)。之后,您可以复制并粘贴查询结果并执行它。根据桌子的数量等,这可能需要一些时间。

标签: sql-server data-cleaning


【解决方案1】:

你可以试试这个

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

【讨论】:

  • 我们对此稍作修改,但最终效果出众。谢谢!
猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 2021-12-31
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多