我要做一个关键子的查询,对一个userinfo表,要用关键字对该表的所有字段进行模糊匹配,由于字段太多鸟,难道我要写where name like '%关键字%' or sex like '%关键字%' or ........
我不想写成那样,请问还有办法吗?

解决方案 »

  1.   

    貌似没什么好办法 
    不用or就用union all
      

  2.   

    如果你自己写sql语句这样写就太麻烦了,建议你在程序里面自动生成where条件语句,一个循环就可以检查所有模湖查询
      

  3.   

    那就只能写循环语句,用游标遍历该表每个字段,对每个字段生成like '%关键字%' sql语句,然后用exec执行。
      

  4.   

    字段多也不是问题啊
    1、首先执行sp_help your_table;把列名全部copy出来,放到记事本也行,不过最后放到ultraedit(支持列编辑)
    然后每行的开头填入:name like '%
    行尾填入:%'
    在最前面加上where,搞定!
      

  5.   

    可以做成一个存储过程,不管字段怎么改动,只要调用存储过程就可以返回你要的结果集
    1) 将表名和 关键字做参数
    2)在系统中找出 表参数 所有的列
    3)构选一个varchar串, 构成成最终要执行的SQL语句
    4)动态执行该串;  
    ----------------------
    每次查询时,只要执行该存储过程就可以了!
      

  6.   

    俺想, 如果要匹配的关键字很多的话, 最好的办法是把关键字放进一张表里(以便以后升级), 用C#生成一个UDF函数, 然后在SQL里调用那个UDF函数做匹配?
      

  7.   

    --我写了一个在整个数据库查找有该值的记录,你可以稍做修改
    declare @s as varchar(500)   -- 要查询的字符串
    declare @t as varchar(500)  -- 要查询的表名
    declare @sql as varchar(8000) set @s = 'simba' 
    set @t = ''  --''为所有表 , 
    -----------查询库中包含指定 指定字符串的 记录 
    create table #tmp_result 
    (
    tablename varchar(500) ,
    columnname varchar(500) ,
    recordcount int 
    )
    declare  cur_sql cursor for 
    select
     'if exists 
    ( select 0   from  [' + o.name  +'] where  ['+c.name + '] like ''%' +  @s + '%'' having count(1) > 0   )
    begin 
    insert #tmp_result
    select ''[' + o.name  + ']'',''[' + c.name + ']'' ,count(1) as ct  from  [' + o.name  +'] 
    where  ['+c.name + '] like ''%' +  @s + '%'' having count(1) > 0  ; 
    end    ' 
    from 
    syscolumns c 
    inner join 
    sysobjects o on c.id = o.id
    inner join 
    systypes t on c.xusertype = t.xusertype
    where o.xtype = 'u'
    and o.name like '%'+ @t+'%'
     and t.name in ('text' 
    --,'sql_variant' 
    ,'ntext' , 'varchar' ,'char' , 'nvarchar' , 'nchar' ,'xml')
    and c.length >= len(@s)
     
     
     OPEN cur_sqlFETCH NEXT FROM cur_sql INTO @sql 
    WHILE @@FETCH_STATUS = 0
    BEGIN
    exec (@sql)
    FETCH NEXT FROM cur_sql INTO @sql
    END
    CLOSE cur_sql
    DEALLOCATE cur_sqlselect * from #tmp_result
    drop table #tmp_result