我写了一个存储过程,要返回记录集中的前x行的数据,我想把@x作为一个参数,也就是输入一个int数字作为参数,返回想获取的前多少行。直接用是不行的,请问有没有什么办法?  
create proc YourSelect
@n int
as
begin
      SET ROWCOUNT @n
      select ID,Name  from  table1  
end
这个方法不能用于select嵌套查询阿!!!!!!!!!!!!如果要实现下面的语句,该怎么办:返回ID<100而且离ID=100最近的@x行,但是结果还要按照升序排列
例如:如果@x==10的话,也就是返回ID=90,91,92,93,......,99的记录。
select * from(SELECT top @x ID,Name FROM table1 where ID<100 order by ID desc ) as aa  order by ID
该怎么使用SET ROWCOUNT @n呢??

解决方案 »

  1.   

    主要问题是:
    返回ID<100而且离ID=100最近的@x行,但是结果还要按照升序排列
    例如:如果@x==10的话,也就是返回ID=90,91,92,93,......,99的记录。
    类似select * from(SELECT top @x ID,Name FROM table1 where ID<100 order by ID desc ) as aa  order by ID
    该怎么使用SET ROWCOUNT @n呢??
      

  2.   

    set @sql='SELECT TOP '+@Top+' COUNT(*) AS Qty ' FROM dbo.[CASE]   GROUP BY CaseTypeID, Prodoctid'
    exec(@sql)你去查动态sql的例子
    其实非常简单的
      

  3.   

    very easy!
    select top 10 * from [case] where caseid<100 order by caseid descif 10 is a variable
    you may excute it like 
    set @sql=select top '+@num+' * from [case] where caseid<100 order by caseid desc'
    exec(@sql)
      

  4.   

    select top 10 * from  (select  top 100  from table1 order by id asc)  as aa order by id desc
      

  5.   

    xuandme000(水丝游云) 我现在就是无法确定top后面是什么数,它是一个输入参数,你的方法不行
      

  6.   

    set @sql='select top '+ @top10 +  ' * from (select top '+ @top100 + ' from table1 order by id asc) as aa order by id desc'
    exec(@sql)
    调试通过
      

  7.   

    xuandme000(水丝游云)' method should probably work, but this is too complicated, you might want to see other methods, for examplePaging of Large Resultsets in ASP.NE
    http://www.codeproject.com/aspnet/PagingLarge.asp
      

  8.   

    谁说的啊,虽然我一惯使用存储过程处理数据,但是直接在程序里面写这样一个sql语句更简单,而且不用考虑动态执行的问题dim sqlstr as string="select top " & @num & " * from [case] where caseid<100 order by caseid desc"随便你试,绝对可以通过如果使用存储过程的,就要用动态执行EXEC了,楼上的兄弟们都给你写出来了我就不说了
      

  9.   

    xuandme000(水丝游云) :
    我说的@top10是一定是nchar类型的吧,但是当 @top10如果是大于12的话就不行了,比如我set @top10=50,结果还是返回12条记录啊??
      

  10.   

    Declare @x varchar(32)
    Declare @sql varchar(2000)
    Set @x='100'
    Set @sql='select * from
    (SELECT top '+@x+' ConID,ConSN FROM ContractSale where ConID<1000 order by ConID desc ) as aa  
    order by ConID'
    exec(@sql)
      

  11.   

    declare @top10 int
    declare @top100 int 
    declare @sql varchar(1000)
    set @top10=10
    set @top100 =100
    set @sql='select top '+str(@top10) +' * from  (select  top ' +str(@top100)  +'* from table where 序号>1000 order by 序号 asc)  as aa order by 序号 desc'
    exec(@sql)
    我试不存在你所说的 @top10如果是大于12的话就不行了的情况.能说详细点吗?
      

  12.   

    多谢saucer(思归)大哥的指教,
    我看看你给的东西先!
      

  13.   

    sql server 2005 可以,如:
    DECLARE @n AS BIGINT
    SET @n = 5SELECT TOP (@n) *
    FROM SalesOrderHeader AS SOH
    ORDER BY OrderDate, SalesOrderIDDECLARE @p AS FLOAT
    SET @p = 0.01SELECT TOP (@p) PERCENT *
    FROM SalesOrderHeader AS SOH
    ORDER BY OrderDate, SalesOrderID要像在2000里用,请参考:
    http://www.sqlteam.com/item.asp?ItemID=233
      

  14.   

    同意用构造sql字符串的方式执行
      

  15.   

    我自己的完整的一个应用:
    drop proc Lottery
    go
    create proc Lottery
    (
        @PageNO int=1,
        @PageSize int,
        @Rows int=0 output
    )
    as
    select @Rows=Count(*) from NameList
    set @PageNO=(@PageNO-1)*@PageSize
    exec
    ('
    select
          top '+@PageSize+' NameList.AutoID,NameList.UserNumber,NameList.Name,NameList.PrizeValue,NameList.UserID,NameList.LDate,Users.IDNO
    from
          NameList
    join
          Users
    on
          NameList.UserID=Users.UserID
    where
          ID not in
    (
    select Top 
          '+@PageNO+' ID
    from
          NameList
    order by
          ID DESC
    )
    order by
          ID DESC
    ')
    GO
      

  16.   

    SQL Server 2000下查询分析器执行如下:
    use Northwind
    declare @xx int
    declare @CategoryId int
    set @xx=16
    set @CategoryId=1declare @strSql nvarchar(3000)
    SET @strSql='SELECT top '+str(@xx)+' ProductID,ProductName,SupplierID,CategoryId FROM Products where CategoryId='+str(@CategoryId)+'order by ProductID desc'
    exec(@strSql)结果就是12条记录,这是为什么?????????
      

  17.   

    当然 我给的例子可能结果的本来就少于16行,但是我在别的地方用的时候就存在返回12条记录的现象。也就是在where后面参数多余2个的时候
      

  18.   

    select * from Products where CategoryId= 1  order by ProductID desc 
    你试一下
    结果就只有12条记录,那么你top 多少都不会超过12
      

  19.   

    我知道为什么了 sorry 我的查询分析器没有刷新!晕!犯了个低级错误
      

  20.   

    不错,学到一个 SET ROWCOUNT ,以前只知道top n
      

  21.   

    怎么这么快就结贴了呀??楼主是想实现分页功能吧?多谢你的提示,学会了SET ROWCOUNT ,我可以完善我的算法了,感谢楼主我的算法是功能:按照ID升序排列declare @n int
    declare @ID intset @n=20SET ROWCOUNT @n
    select @ID= newsID from newsprint @id               --定位SET ROWCOUNT 10
    select * from news where newsID > @id
    另外 BS那些用exec回复的人,在存储过程里面用exec ,那使用存储过程还有多大意义呢,而且只局限在能实现就可以了,而不去寻求更高效的解决方法。这样怎么提高呀!!!
      

  22.   

    多谢 jyk(jyk)!你的建议很好,还有我看了你的例子。多谢了。