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

惭愧,这个存储过程报错,不知道怎么改,特来请教。
就是普通的select top n *,我想取前几条能用变量自己设定,但是select top @Total * 貌似不能用,不知道该改成什么样的,求指导。谢谢!


SQL code

CREATE PROCEDURE Getlist
@Classid int,
@Total int

AS
if(@Total>=6)  
select top 6 * from tb_article where Classid = @Classid
else  
begin
select top @Total * from tb_article where Classid = @Classid
union all
select top (6 - @Total) * from tb_article where Classid = @Classid 
end


------解决方案--------------------

------解决方案--------------------
加个 () 如
SQL code
select top (@Total) * from tb_article where Classid = @Classid

------解决方案--------------------
CREATE PROCEDURE Getlist
@Classid int,
@Total int

AS
if(@Total>=6)
select top 6 * from tb_article where Classid = @Classid
else
begin
declare @sql nvarchar(4000)
set @sql='select top '+ltrim(@Total)+' * from tb_article where Classid = '+ltrim(@Classid)+' 
union all
select top '+ltrim(6 - @Total)+' * from tb_article where Classid = '+ltrim(@Classid))
exec(@sql) 
end

SQL2K
------解决方案--------------------
top(@Total) 05及以上版本可以。

如果是2000,需要拼接SQL的动态语句去执行。
------解决方案--------------------
SQL code


select top (@Total) * from tb_article where Classid = @Classid

------解决方案--------------------
探讨

我在 union all 前面的select语句加了 order by xxx 会报错。但是从功能上来说 order by又必须加。再次请求帮助

------解决方案--------------------