这个不是全文索引,所以不要指望什么特别高的效率。这个主要的目的是用于在全库检索指定的值,看看是在那个表的那个字段里。但肯定要比人工一项项找快的多,测试库是一个运行多年的HIS库,里面数据量为3.6G左右,实测用时1分37秒。这个脚本的基本原理是动态构建SQL脚本,在特定类型的数据列(这里是文本类型的字符列:char / nchar / varchar / nvarchar / text /next)。
declare @sql nvarchar(4000),@tablename sysname,@colname sysname,@key sysname set @key='''随%''' declare c cursor fast_forward for select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='BASE TABLE'; open c fetch next from c into @tablename while @@FETCH_STATUS=0 begin declare col cursor fast_forward for select COLUMN_NAME from information_schema.columns where table_name=@tablename and data_type in ('char','varchar','nchar','nvarchar','text','ntext') open col fetch next from col into @colname while @@FETCH_STATUS=0 begin set @sql='if exists (select * from ['+@tablename+'] where ['+@colname+'] like '+@key+')'+char(13)+CHAR(10)+' print ''表'+@tablename+'.'+@colname+' 找到目标值。'''; exec sp_executesql @sql fetch next from col into @colname end; close col; deallocate col; fetch next from c into @tablename end; close c deallocate c
在上面的脚本中,@key用于指定要过滤的表达式关键词,这里因为我要查找的是字符串,所以使用的是重复的单引号。注意自己用重复单引号,因为是用在后面动态生成脚本时用的。如果你要检查的不是字符串,那么不防改下data_type的值,然后 like 改成你要的操作符。
下面是脚本的输出结果:
表ZyDkInId.sc_fact 找到目标值。 表BA_BRZYXX.BRXM00 找到目标值。 表XT_ICD100.JBMC00 找到目标值。 表t_d_doc_rcpdet.Item_Name 找到目标值。 表XT_XS0000.MC0000 找到目标值。 表t_d_clinic_rcpdet.Item_Name 找到目标值。 表XT_ZD0000.ZDMC00 找到目标值。 表t_a_type.type_name 找到目标值。 表t_b_reg_patient.patient_name 找到目标值。 表t_d_clinic_receipt.patient_name 找到目标值。 表t_b_case_Icd.Case_Name 找到目标值。 表t_b_diag_item.Item_Name 找到目标值。