sql - 在数据库的所有表、行和列中搜索字符串

标签 sql sql-server-2005

我迷失在一个大数据库中,无法找到我获得的数据来自哪里。我想知道是否可以使用 SQL Server 2005 在数据库的所有表、行和列中搜索字符串?

有人知道是否可能以及如何实现吗?

最佳答案

此代码应该在 SQL 2005 中执行此操作,但有一些注意事项:

  1. 速度慢得离谱。我在一个只有少数表的小型数据库上测试了它,花了很多分钟才能完成。如果您的数据库太大以至于您无法理解它,那么这可能无论如何都无法使用。

  2. 这是我即兴写下的。我没有进行任何错误处理,并且可能存在其他一些草率,特别是因为我不经常使用游标。例如,我认为有一种方法可以刷新列光标,而不是每次都关闭/解除分配/重新创建它。

如果您无法理解数据库或不知道数据从何而来,那么您可能应该找到懂的人。即使您可以找到数据的位置,它也可能在某个地方重复,或者数据库的其他方面可能是您不理解的。如果您公司中没有人了解数据库,那么您就会陷入一团糟。

DECLARE
    @search_string  VARCHAR(100),
    @table_name     SYSNAME,
    @table_schema   SYSNAME,
    @column_name    SYSNAME,
    @sql_string     VARCHAR(2000)

SET @search_string = 'Test'

DECLARE tables_cur CURSOR FOR SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'

OPEN tables_cur

FETCH NEXT FROM tables_cur INTO @table_schema, @table_name

WHILE (@@FETCH_STATUS = 0)
BEGIN
    DECLARE columns_cur CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @table_schema AND TABLE_NAME = @table_name AND COLLATION_NAME IS NOT NULL  -- Only strings have this and they always have it

    OPEN columns_cur

    FETCH NEXT FROM columns_cur INTO @column_name
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        SET @sql_string = 'IF EXISTS (SELECT * FROM ' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ' WHERE ' + QUOTENAME(@column_name) + ' LIKE ''%' + @search_string + '%'') PRINT ''' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ', ' + QUOTENAME(@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_schema, @table_name
END

CLOSE tables_cur

DEALLOCATE tables_cur

关于sql - 在数据库的所有表、行和列中搜索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/591853/

相关文章:

php - 为什么日期之间的查询返回空

MySQL - 从双重嵌套子查询引用外表值

sql-server - 信息模式和主键

sql - 清除 SQL 表

sql-server-2005 - 无法在 sysdatabases 中找到数据库 'mydb' 的条目

带有日期计数器的sql while循环

sql - 查询以检查记录是否存在超过 X 小时

sql - Oracle SQL 按单个字段分组并计算分组的行数

c# - MySql 参数化存储过程在 C# 中不起作用

sql - 如何获取Viditymart的产品总数?