要创建一个返回指定条记录结果的存储过程,首先必须指定返回结果集的条记录数,可以用临时表,也可以用table变量(sql server 2000),两个在性能上没有太大的差别,但是,table变量是存储在内存中的,如果你的服务器内存不多的话,可以考虑用临时表,临时表使用硬盘存储结果,临时表需要手工释放对象,而table变量在存储过程结束后自动释放。
下面就是我们要创建的存储过程:
create proc getauthors
@author_last_name as varchar(100) = null,
@startrow as int = null,
@stoprow as int = null
as
---- 建立有标识符列的table变量
declare @t_table table
(
[rownum] [int] identity (1, 1) primary key not null ,
[author_last_name] [varchar] (40) ,
[author_first_name] [varchar] (20) ,
[phone] [char] (12) ,
[address] [varchar] (40) ,
[city] [varchar] (20) ,
[state] [char] (2) ,
[zip] [char] (5)
)
---- 在返回指定的@stoprow行数之后停止处理查询
set rowcount @stoprow
---- 插入到table变量中
insert @t_table
(
[author_last_name],[author_first_name],[phone],[address],[city],[state],[zip]
)
select [author_last_name],[author_first_name],[phone],[address],[city],[state],[zip]
from authors
where author_last_name like '%' + @author_last_name + '%'
order by author_last_name
---- 返回到正确的结果
select * from @t_table where rownum >= @startrow
order by rownum
go
参数@startrow和@stoprow接收整数值,代表要返回的开始记录和结束记录,如果要在一个25条记录的页面中返回第4页,我们就可以设置@startrow为76,@stoprow为100。我们在table变量@t_table中定义了一个叫rownum的整数类型的列,并指定为标识符列,这个列在我们这里介绍的分页技术中是很重要的,当我们插入数据时,这个列自动增加,它将在插入数据时起排序作用。set rowcount语句对优化性能很关键,它告诉sql server进行限制要插入的数据,如果我们要76-100条记录之间的数据,那么就可以不必插入大于100条记录的数据。最后的sql语句从@t_table的table变量选择rownum大于或者等于@startrow的那些数据集,然后把它们返回到web服务器,由web服务器绑定到datagrid对象。值得注意的是:如果要得到76到100条记录的数据,我们必须往table变量中插入100条记录的数据,这意味着:如果浏览者请求的页数越来越大,页面性能也会有所下降的。例如:要显示第100页的数据(从第2451条记录到第2500条记录),我们必须先向table变量或者临时表填充2500条记录,因此,性能依赖于你计算机的硬件和你要返回的记录数,有测试表明,在sql server 2000中使用这样的存储过程平均在200-250毫秒内返回第100页,而返回第一页只需要4毫秒。即使返回第500页的数据(从第12451到12500条记录)也可以在650到750毫秒内完成。应该说这种情况是很少见到的。 但为了减轻数据库和网络传输的压力,设计合理的查询结果页数是很见效的。
摘自http://dotnet.aspx.cc/showdetail.aspx?id=108b1516-53ce-4357-b061-17295af9689f