昨天发了一个求助贴子,自己说得不清楚,再次请教各位大虾。想在一个循环中先声明两个变量,然后在后面的变量中应用declare @mb int 
select @mb=0 
while @mb <=10 begin 
declare @QE int,@QF int,
select @QE=a.e from MB'+ltrim(@mb)+' a where a.a=1  
select @QF=a.f from MB'+ltrim(@mb)+' a where a.a=1  declare @A varchar(1000)
  set @A=
'
insert into TB select a.a,a.b,a.c,a.d from mb'+ltrim(@mb)+' a
 where '+ltrim(@QE) +' < '+ltrim(@QF) +' and '+ltrim(@QE) +' + '+ltrim(@QF) +' !=100
'
exec(@A)set @mb=@mb+1 
end 

解决方案 »

  1.   

    declare @A varchar(1000) 
    这个不要在循环里一直创建。你就放在循环外面创建好了,然后在每次循环开始前先把这个值设为空
      

  2.   


    declare @mb int 
    declare @QE int,@QF int
    declare @A varchar(1000) select @mb = 0 
    while @mb <= 10 
    begin 
      select @QE = a.e from MB'+ltrim(@mb)+' a where a.a = 1  
      select @QF = a.f from MB'+ltrim(@mb)+' a where a.a = 1  
      set @A= ' insert into TB select a.a,a.b,a.c,a.d from mb'+ltrim(@mb)+' a 
                where '+ltrim(@QE) +' < '+ltrim(@QF) +' and '+ltrim(@QE) +' + '+ltrim(@QF) +' !=100 ' 
      exec(@A) 
      set @mb = @mb + 1 
    end PS一句,LZ你写的SQL语句格式很乱啊
      

  3.   

    大家都知道你的意图,是你自己懒得理解大家的答案类似 declare @s nvarchar(1000)
      
      declare @ee int,@ff int,@gg int
      select @ee=1,@ff=1,@gg=1,
      @s=N'insert into TB1 select n.e,n.f,n.g from TB2 m where (@e=m.e and @f=m.f and @g=m.g) and m.a-m.b!=n.a-n.b'
      exec sp_executesql @s,N'@e int,@f int,@g int',@e=@ee,@f=@ff,@g=@gg好好理解sp_executesql 和exec有什么不同
      

  4.   

    begin 
    declare @QE int,@QF int, 
    select @QE=a.e from MB'+ltrim(@mb)+' a where a.a=1  
    select @QF=a.f from MB'+ltrim(@mb)+' a where a.a=1  
    首先这里就有问题,这里就得是动态的
      

  5.   

    是要运行动态SQL吧?
    用exec(@sql)
      

  6.   


    declare @mb int 
    declare @QE int,@QF int
    declare @A varchar(1000) select @mb = 0 
    while @mb <= 10 
    begin 
      select @QE = a.e from MB'+ltrim(@mb)+' a where a.a = 1  
      select @QF = a.f from MB'+ltrim(@mb)+' a where a.a = 1  
      set @A= ' insert into TB select a.a,a.b,a.c,a.d from mb'+ltrim(@mb)+' a 
                where '+ltrim(@QE) +' < '+ltrim(@QF) +' and '+ltrim(@QE) +' + '+ltrim(@QF) +' !=100 ' 
      exec(@A) 
      set @mb = @mb + 1 
    end 
      

  7.   


    sp_executesql能通过以上方式动态改变要查询的表吗?LZ的意思好象是动态访问表取得值,然后再插入到表中。
      

  8.   

    可能是给@Q\@QF赋值那里出错了提示错误:服务器: 消息 170,级别 15,状态 1,行 6
    第 6 行: '+ltrim(@mb)+' 附近有语法错误。
    服务器: 消息 170,级别 15,状态 1,行 7
    第 7 行: '+ltrim(@mb)+' 附近有语法错误。
      

  9.   

    兄弟,慢慢来。。几天前我连is null 和=null我都弄不清楚。。从基础做起,把基础的东西串联起来就是大虾了。。大学都是潇洒过来的。。现在又重新来。。唉。。