根据我的要求,我必须查找在哪些列表中是否存在诸如 xyz@test.com 值之类的词。数据库很大,有2500多个表。
任何人都可以提供从数据库中查找这种类型的值的最佳方法。我创建了一个循环查询,该查询耗时约9个小时以上。
答案 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
返回
如果有帮助,则单个查询看起来像这样
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语句的任何语句中条件匹配,则将该表名和列名存储在另一个临时表中。并在执行结束时从临时表中检索这些记录的列表。