日期:2014-05-17  浏览次数:20483 次

必须声明标量变量 "@indextable"。
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 ' + @endIndex

print @sqlStr

请问如上代码,明明已经申明了@indextable ,为什么还报错,要申明标量变量 "@indextable"。呢?
请大家帮帮忙,谢谢了!

------解决方案--------------------
@sqlStr是varchar形式的,@indextable是table形式的,你set @sql=...+@indextable
------解决方案--------------------
你的类型结构不一样,所以回报错
------解决方案--------------------
--表变量是不能进行字符串+运算的.且表变量在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)

------解决方案--------------------
要实现你的需求,不要用表变量,而是用临时表吧,而且用临时表的性能更好,速度更快:

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 ' + @startIndex + ' and ' + @endIndex

print @sqlStr