有一个简单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)
的语句呢
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)
的语句呢
set @sql ='select '+@collists+' from t1'exec(@sql)
select left 3 from (select f1,f2,f3,f4,f5 from t1)
--MSSQL没有这种写法
--为什么不直接查询呢?
select f1,f2,f3 from t1
具体的原因是,我需要进行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之类的语句就解决啦,不知道我说明白没有。
exec @sql1+@sql2+@sql3+....
会报错:+ 附件有语法错误!
exec (@sql1+@sql2+@sql3+@sql4)
我的语句如下所示:
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