[脚本]MSSQL在全库中查找指定的内容出现的表及字段

这个不是全文索引,所以不要指望什么特别高的效率。这个主要的目的是用于在全库检索指定的值,看看是在那个表的那个字段里。但肯定要比人工一项项找快的多,测试库是一个运行多年的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 找到目标值。

 

分享到: