declare @indextable table(id int identity(1,1),nid int)
set rowcount @endIndex
insert into @indextable(nid) select ID from Info  order by ID desc set @sqlStr=@sqlStr + 'select * from Info O, ' + @indextable +' t where O.ID=t.nid
and t.id between ' + @startIndex + ' and ' + @endIndexprint @sqlStr请问如上代码,明明已经申明了@indextable ,为什么还报错,要申明标量变量 "@indextable"。呢?
请大家帮帮忙,谢谢了!

解决方案 »

  1.   

    @sqlStr是varchar形式的,@indextable是table形式的,你set @sql=...+@indextable
      

  2.   

    --表变量是不能进行字符串+运算的.且表变量在EXEC的作用域中是看不见的.
    --根据楼主的意图,参考如下:
    DECLARE @sqlStr VARCHAR(MAX), @startIndex INT, @endIndex INT
    CREATE TABLE #indextable (id int identity(1,1),nid int)
    set rowcount @endIndex
    insert into #indextable(nid) select ID from Info  order by ID DESC
    set @sqlStr=@sqlStr + 'select * from Info O, #indextable t where O.ID=t.nid and t.id between ' + LTRIM(@startIndex) + ' and ' + LTRIM(@endIndex)
    EXEC(@sqlStr)
      

  3.   

    之所以会报错是因为,你定义的表变量@indextable,而你想把这个@indextable拼接到动态语句中,是不行的,因为@indextable并不是一个值,而是一个表变量,也就是一个表,你这是把一个表和一个字符串相加,肯定报错。
      

  4.   

    要实现你的需求,不要用表变量,而是用临时表吧,而且用临时表的性能更好,速度更快:create table #indextable(id int identity(1,1),nid int)
    set rowcount @endIndexinsert into #indextable(nid) 
    select ID from Info  order by ID descset @sqlStr=@sqlStr + 'select * from Info O, ' + '#indextable' +' t where O.ID=t.nid
    and t.id between ' + @startIndex + ' and ' + @endIndexprint @sqlStr
      

  5.   

    非常感谢大家的回复,正如你们所说,对象不同,不能组合到一个字符串中,并且按照yupeigu和wwwwgou的方法,做了修改,已调试成功过,再次感谢!