有一个表t,100列,字段分别为a1,a2,a3...a100
现在我需要写一个查询,select * from t where a1="a" and a2="a" and a3="a"...and a100="a"
就是找出所有字段等于a的,怎么简写呢?这样写也太笨拙了。。

解决方案 »

  1.   

    这已经是最好的写法了短点的写法(并不好)
    where a1+a2+...+a100 = replicate('a',100)
      

  2.   

    有没有办法让字段不出现?就是类似all='a'之类的语法,因为其实每个字段都很长,这里只是用a1a2指代下
      

  3.   

    楼主写的是可以的,把双引号改成单引号即可。可以用Vidor提供的方式,会看起来短一些。
    declare @sql varchar(max)
    set @sql='select * from t where 1=1'
    select @sql=@sql+' and '+name+'=''a''' 
    from syscolumns where id=object_id(N't')
    exec(@sql)
      

  4.   


    #3动态循环表的所有列,然后拼接,这样就不用你一个列一个列的写了。
    exec(@sql) 之间你可以先select @sql 看看结果。
      

  5.   

    没有all='a'的语法如果实在太长,就从syscolumns表来构造吧
    declare @sql varchar(8000)
    select @sql=isnull(@sql+' and ','')+name+'=''a''' from syscolumns where id = object_id('your table name')
    set @sql='select * from [your table name] where '+@sql
    print @sql
      

  6.   

    弱弱地问一句,#3中的name是会动态获取的吗?可以动态获取所有的字段名?
      

  7.   

    name 是系统表sys.objects的字段
    你可以select * from sys.objects  where id=object_id(N't') 看下就知道了
      

  8.   

    查询出来的是100条记录,每天记录中有一个字段name?手边用的不是自己的电脑,木有装数据库,压力大。。