declare @ varchar(8000)
set @=''
select @=@+rtrim(name)+',' from syscolumns where id=object_id('zryxxb') and name not in ('你不要的列名1','你不要的列名2','你不要的列名3','你不要的列名4')
set @=left(@,len(@)-1)exec('insert jyxxb select '+@+' from zzryxxb where ... ')

解决方案 »

  1.   

    参考:
    http://expert.csdn.net/Expert/topic/2270/2270480.xml?temp=.9384424
      

  2.   

    --用生成SQL的方法:delcare @s1 varchar(8000),@s2 varchar(8000)
    select @s1='insert into zzryxxb('
    ,@s2=' select 'select @s1=@s1+a.name+',',@s2=@s2+b.name+','
    from(
    select name from syscolumns where object_id('zzryxxb')=id
    ) a inner join(
    select name from syscolumns where object_id('zzryxxb')=id
    ) b on a.name=b.nameselect @s1=left(@s1,len(@s1)-1)
    ,@s2=left(@s2,len(@s2)-1)
    exec(@s1+')'+@s2+' from jyxxb')
      

  3.   

    得到的@变量,是排过序的(从a,b,...z),和jyxxb中的顺序不同,运行提示“插入错误: 列名或所提供值的数目与表定义不匹配”怎么办?谢谢!
      

  4.   

    用邹建的办法,对在zzryxxb中有的字段,而jyxxb表中没有的字段,提示列名无效,而对jyxxb中有的字段而zzryxxb没有的字段,没有错误提示。
      

  5.   

    共有69个字段,但提示列名无效的两个列,恰好是在zzryxxb表中有,而在jyxxb中不存在的两个字段,所以不象是变量存储不下。先谢谢你了!
      

  6.   

    但我的语句是a.name=b.name,按理说应该是两个表中都有,而且是列名相同的才会被处理啊?真是奇怪.如果方便的话,是否贴出表结构?
      

  7.   

    稍改一下:
    declare @ varchar(8000)
    set @=''
    select @=@+rtrim(name)+',' from syscolumns where id=object_id('zryxxb') and name not in ('你不要的列名1','你不要的列名2','你不要的列名3','你不要的列名4')
    set @=left(@,len(@)-1)exec('insert jyxxb select '+@+',0,0 from zzryxxb where ... ')对于在zzryxxb表中有,而在jyxxb中不存在的两个字段
    先假设是最后两个字段,再假设为数字型
      

  8.   

    邹健的方法是通了,问题出在把两个表名弄反了,改过来就可以了,但是如果jyxxb中包含了几个zzryxxb中的字段,就不行了,提示那几个字段无效,谢谢。马可的方法没试出来,可能时假设不存在,这些字段在中间,不知怎么办,谢谢
      

  9.   

    别光高兴,但是如果jyxxb中包含了几个zzryxxb中的字段,就不行了,提示那几个字段无效,这还有招吗?