代码之家  ›  专栏  ›  技术社区  ›  LoveMeSomeCode

SQL超级搜索

  •  1
  • LoveMeSomeCode  · 技术社区  · 16 年前

    是否有人有一个好的方法来搜索整个数据库中的给定值? 我有一个特定的字符串要查找,它在表A中,对于其他表TableB也是FK,只是我不知道它是哪个表/列。

    假设有一个Jillion表,我不想把它们都看一遍,也许在几个不同的情况下必须这样做,那么最好的方法是什么?

    因为我不想要代码SQL桥,所以我唯一的SQL想法是:

    select tablename and column_name from INFORMATION_SCHEMA.COLUMNS
    

    …然后使用光标翻转所有列,对于nvarchar的所有数据类型,我将执行动态SQL,如下所示:

    SELECT * from @table where @column =  @myvalue
    

    不用说,这是一个缓慢和记忆的猪。

    有人有什么想法吗?

    5 回复  |  直到 16 年前
        1
  •  3
  •   Ben Gribaudo    16 年前

    下面是几个链接,讨论如何执行此操作:

    他们都使用了你希望避免的方法。优化它们,使它们只搜索作为外键的列,这样就可以通过消除不必要的表搜索来提高性能。

        2
  •  6
  •   Andy Ross    16 年前

    转储数据库和grep?

    我想一个更集中的问题可能是:如果你不知道这个模式是如何工作的,那么你将如何处理你得到的答案呢?

        3
  •  2
  •   Steve Kass    16 年前

    这是我几年前写的一个解决方案: http://www.users.drew.edu/skass/sql/SearchAllTables.sql.txt

        4
  •  0
  •   Aye    16 年前

    只需使用或在所有相关列中搜索的SP。

    为什么不知道要搜索哪些列?

    如果列的列表一直在移动,那么您只需要确保任何导致模式更改的过程都会导致此存储过程中的更改。

    如果列列表太大,您无法在SP中键入内容,请使用一些基本的perl/grep/whatNot在一行中完成,例如Sybase。

    my_dump_table_schema.pl|egrep "( CHAR| VARCHAR)"|awk '{$1}'|tr "\012" " "|perl -pe '{s/ / = \@SEARCH_VALUE OR /g}'; echo ' = @SEARCH_VALUE'
    

    需要最后一个回声将值添加到最后一列

        5
  •  0
  •   KM.    16 年前

    要转储数据,请阅读 bcp Utility