有一个简单select 语句如下所示:
select f1,f2,f3 from (select f1,f2,f3,f4,f5 from t1)
可是select f1,f2,f3,f4,f5 from t1可能的列数是不定的,我需要从这些不定的列数中去固定的列数,或者某个固定的列数,或者说我就要从select f1,f2,f3,f4,f5 from t1结果集中取出前3列的值,有没有类似于:
select left 3 from (select f1,f2,f3,f4,f5 from t1)
的语句呢

解决方案 »

  1.   

    --直接拼接出来就行set @colists = 'f1,f2,f3'
    set @sql ='select '+@collists+' from t1'exec(@sql)
      

  2.   


    select left 3 from (select f1,f2,f3,f4,f5 from t1)
    --MSSQL没有这种写法
    --为什么不直接查询呢?
    select f1,f2,f3 from t1
      

  3.   

    谢谢各位的回复!
    具体的原因是,我需要进行sql数据库移植,由于移植过程导致移植后数据仍有差异,需要将差异数据插入到新数据库中,我在网上查到如下的语句:
    insert into BF_plan_D(PROD_DATE,FACTORY_CODE,FACTORY_NAME,PRD_PLAN_WT,BF_TIME,SM_1,SM_2,SM_3)
    select cc.PROD_DATE,cc.FACTORY_CODE,cc.FACTORY_NAME,cc.PRD_PLAN_WT,cc.BF_TIME,cc.SM_1,cc.SM_2,cc.SM_3
    from (
       select aa.PROD_DATE,aa.FACTORY_CODE,aa.FACTORY_NAME,aa.PRD_PLAN_WT,aa.BF_TIME,aa.SM_1,aa.SM_2,aa.SM_3,
        bb.PROD_DATE as tcol1, bb.FACTORY_CODE as tcol2  
           from BF_plan_D aa 
         left join  SQL184.xc_database.[dbo].BF_plan_D bb 
         on aa.PROD_DATE=bb.PROD_DATE and aa.FACTORY_CODE = bb.FACTORY_CODE) 
         as cc 
    where cc.tcol1 is null and cc.tcol2 is null
    由于表很多,所以使用动态sql语句,但sql动态sql限制在4000,有一些表列很多,多达300多个,这样导致字符串长度远远超过4000,所以我在用*代替列名,修改成如下方式:
    insert into BF_plan_D 
    select * from (select bb.*,aa.PROD_DATE as tcol1, aa.FACTORY_CODE as tcol2  
           from BF_plan_D aa 
         left join  SQL184.xc_database.[dbo].BF_plan_D bb 
         on aa.PROD_DATE=bb.PROD_DATE and aa.FACTORY_CODE = bb.FACTORY_CODE) 
         as cc 
    where cc.tcol1 is null and cc.tcol2 is null
    大家可以看出,这样文本的长度就不可能超过4000,可以问题来了,第二行的select * 的字段个数大于BF_plan_D的字段个数,所以,如果有select left 8之类的语句就解决啦,不知道我说明白没有。
      

  4.   

    超过4000个拆分 exec @sql1+@sql2+@sql3+....
      

  5.   

    结完贴,我才发现
    exec @sql1+@sql2+@sql3+....
    会报错:+ 附件有语法错误!
      

  6.   


    exec (@sql1+@sql2+@sql3+@sql4)
      

  7.   

    难道是我的SQLSERVER版本的问题吗?我的版本是sqlserver2000.
    我的语句如下所示:
    declare @param nvarchar(100)
    declare @roadx int
    set @param =  '@roadx int'
    declare @sSql1 nvarchar(4000)
    declare @sSql2 nvarchar(4000)
    set @sSql1 = 'insert into t1 '
    set @sSql2 = ' select * from t1'
    exec sp_executesql (@sSql1 + @sSql2) ,@param,@roadx