日期:2014-05-18  浏览次数:20499 次

请教SQL Server 2005公用表达式及循环问题
在SQL   Server   2000中实现循环一般用游标来实现,但游标比较耗资源,所以我想利用一下SQL   Server   2005的新特性,使用公用表达式和while循环来实现
下面的代码在while循环外面select   *   from   TempTable是有返回结果的,但是在循环里面,select   @CorpID=CorpID   from   TempTable   where   row=@i
这句会提示“对象名     'TempTable '   无效。”,不知道为什么会这样,难道公用表达式有生命周期?是否有更好的方法实现?望指教!谢谢。

declare   @CorpID   char(36)
declare   @count   int
declare   @i   int
set   @i=1

with   TempTable   as   (select   CorpID,ROW_NUMBER()   over(order   by   DateUpdate   desc)   as   row   from   Corporation)
--select   *   from   TempTable
select   @count=count(*)   from   Corporation
while   @count> 0
begin
select   @CorpID=CorpID   from   TempTable   where   row=@i
                  --其他操作
set   @i=@i+1
set   @count   =   @count   -1
print   @CorpID
end

------解决方案--------------------
楼主再去看看CTE的说明, CTE是一个表达式, 不是一个虚拟表或者虚拟视图, 所以它不可能在CTE之外被引用.
而楼主的语句却是在CTE之外引用CTE表达式