高分求一个存储过程(200分)

  • 主题发起人 无业游民
  • 开始时间

无业游民

Unregistered / Unconfirmed
GUEST, unregistred user!
求一SQL Server的存储过程:
返回指定SQL语句从第N记录开始的M条记录。也就是返回一个数据集的子集。
目的是希望能够分段存取数据,减少网络Trip。

 
用TOP呀
先取到M条
Select Top M * from Talbe
再Order By Desc
Select Top M-N from Table
应该可以吧
 
我没有写注释,看不懂得话问我。

CREATE PROCEDURE proc_visitor_sel_admincheck
@topcount int = 1000000,
@page int = 1,
AS

DECLARE @sSQL VARCHAR(8000)
DECLARE @counts INT
DECLARE @tempwords VARCHAR(100)

BEGIN TRAN

SET @sSQL = ''

If (@topcount IS NULL)
SET @topcount = 1000000

select @counts = Count(V_id) from Visitor

SET @sSQL = ''
If (@topcount IS NULL)
SET @topcount = 1000000

IF @counts <= @topcount
BEGIN
SET @sSQL = 'select top '+ CONVERT(VARCHAR(8), @counts) +' * from Visitor order by V_ID DESC'
END
Else
BEGIN
IF @page < (@counts/@topcount)/2
BEGIN
IF @page < 1 SET @page = 1
IF @page = 1
SET @sSQL = 'select top '+ CONVERT(VARCHAR(8), @topcount * @page) +' * from Visitor order by V_ID DESC'
ELSE
BEGIN
SET @sSQL = 'select top '+ CONVERT(VARCHAR(8),@topcount * @page) +' v_id from Visitor order by V_ID DESC'
SET @sSQL = 'select top '+ CONVERT(VARCHAR(8),@topcount) +' v_id from Visitor where v_id in ('+ @sSQL +') order by v_id ASC'
SET @sSQL = 'select top '+ CONVERT(VARCHAR(8),@topcount) +' * from Visitor where v_id in ('+ @sSQL +') order by v_id DESC'
END

END
ELSE
BEGIN
IF @page > (@counts/@topcount + 1) SET @page = @counts/@topcount + 1

SET @sSQL = 'select top '+ CONVERT(VARCHAR(8), @counts - @topcount * (@page-1)) +' v_id from Visitor order by V_ID ASC'
SET @sSQL = 'select top '+ CONVERT(VARCHAR(8),@topcount) +' * from Visitor where v_id in ('+ @sSQL +') order by v_id DESC'
END

END

--执行
EXECUTE(@sSQL)
--

IF @@ERROR <> 0
ROLLBACK TRAN
ELSE
COMMIT TRAN
GO
 
这是个3-6的查询里面的变量自己再带一下
Select * from
(Select Top 4 * from
(Select Top 6 * from Employee order by ID) as a order By ID desc)
as b order by ID

 
to : Adnil
这样的东西写好后,我怎么调用呢 ?
 
to Adnil:
我想我基本了解了你的思路。但是与我所要的有一点出入,我对存储过程比较菜。
我想要得存储过程的参数有三个:
SQLText:SQL查询语句,返回的结果集应是他的子集。
StartRow:起始行的序号,也就是说从第一条记录到StartRow条记录放弃。
PageRow:需要取得数据的行数,StartRow+PageRow以后的记录放弃。
当然在Delphi里我很容易实现该功能,但是这样将有很多无效的数据从数据库
服务器向数据处理端传送,所以我想用存储过程处理完之后再传送。
当然在调用时会尽可能使SQLText的数据集并不是很大。
SQLText的关键词也许并不确定,如果确定的话也就不存在问题了,我可以使用
记录起始记录的关键字段得值然后用Top限定词做到。
返回的子集使用XML返回也可以。
 
顶部