2010-12-23 75 views
1

我想创建一个存储过程,它将整数值作为@top,这样我就可以在我的查询中使用它,但它不允许我动态设置top的值。动态计算顶部数

select top @top * from (select url, 
count(1) as shared from tblshared 
group by url, uniqid having 
uniqid = @uniqid) as sha order by 
shared desc 

我想获取顶级的n记录表,所以我想传递的n在存储过程中的价值,它将返回我,多家顶级记录。

注意:我不想使用exec

谢谢。

+0

哪个版本的SQL Server? – 2010-12-23 11:34:27

+0

@使用sql server 2005 – 2010-12-23 11:43:50

回答

1

你可以使用SET ROWCOUNT

SET ROWCOUNT @top 
SELECT ... 
SET ROWCOUNT 0 
0
declare @v1 int 
set @v1 = 25 
set rowcount @v1 
select * from MyTable Order by DateColumn 
set rowcount 0 
+1

-1这适用于中间结果。所以聚合和子查询可能是错误的。 TOP适用于预期 – gbn 2010-12-23 19:43:46

4

,如果在括号包裹@top将正常工作

select top (@top) * 
from ( 
    select url, count(1) as shared 
    from tblshared 
    group by url, uniqid 
    having [email protected]) as sha 
order by shared desc 
+0

得到此错误:消息170,级别15,状态1,行1 行1:错误的语法附近'('。它显示错误'(' – 2010-12-23 11:27:02

2

可以使用ROW_NUMBER() isntead的顶部

with t1 as(
    select url,row_number() over(
       partition by url, uniqid order by url, uniqid desc) as shared 
    from tblshared 
    where uniqid = @uniqid) 

select * from t1 where shared < @top 

REF