从数据库表中查找特定值的最简单,最优化的方法是什么?

时间:2018-09-21 11:25:52

标签: sql-server

根据我的要求,我必须查找在哪些列表中是否存在诸如 xyz@test.com 值之类的词。数据库很大,有2500多个表。

任何人都可以提供从数据库中查找这种类型的值的最佳方法。我创建了一个循环查询,该查询耗时约9个小时以上。

2 个答案:

答案 0 :(得分:2)

9小时显然很长。此外,对我来说,2500张桌子似乎很疯狂。

这是一种将对每个表运行1个查询,而不对每列运行1个查询的方法。现在我不知道如何处理2,500张桌子。我怀疑这可能太可怕了。也就是说,我强烈建议首先使用Table_Name like 'OD%'

这样的测试过滤器

示例

Declare @Search varchar(max) = 'cappelletti'  -- Exact match '"cappelletti"'

Create Table #Temp (TableName varchar(500),RecordData xml)
Declare @SQL varchar(max) = ''
Select @SQL = @SQL+ ';Insert Into #Temp Select TableName='''+concat(quotename(Table_Schema),'.',quotename(table_name))+''',RecordData = (Select A.* for XML RAW) From '+concat(quotename(Table_Schema),'.',quotename(table_name))+' A Where (Select A.* for XML RAW) like ''%'+@Search+'%'''+char(10)
 From  INFORMATION_SCHEMA.Tables 
 Where Table_Type ='BASE TABLE'
   and Table_Name like 'OD%'    -- **** Would REALLY Recommend a REASONABLE Filter *** --

Exec(@SQL)

Select A.TableName
      ,B.*
      ,A.RecordData
 From  #Temp A
 Cross Apply (
                Select ColumnName = a.value('local-name(.)','varchar(100)')
                      ,Value      = a.value('.','varchar(max)') 
                 From  A.RecordData.nodes('/row')  as C1(n)
                 Cross Apply C1.n.nodes('./@*') as C2(a)
                 Where a.value('.','varchar(max)')  Like '%'+@Search+'%'
             ) B


Drop Table #Temp

返回

enter image description here

如果有帮助,则单个查询看起来像这样

Select TableName='[dbo].[OD]'
      ,RecordData= (Select A.* for XML RAW) 
 From  [dbo].[OD] A 
 Where (Select A.* for XML RAW) like '%cappelletti%'

在旁注中,您可以搜索数字数据甚至日期。

答案 1 :(得分:1)

使用表名称为列的VARCHAR数据类型创建一个过程,并将其从系统表存储到临时表中。

现在通过使用电子邮件地址的输入参数对具有LOOP条件的每条记录执行一个=来进行一个动态查询。

如果在使用IF EXISTS语句的任何语句中条件匹配,则将该表名和列名存储在另一个临时表中。并在执行结束时从临时表中检索这些记录的列表。