存储过程分页又一方法(使用table变量)(摘)

来源:互联网 发布:扫描二维码软件下载 编辑:程序博客网 时间:2024/05/22 17:16
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
要创建一个返回指定条记录结果的存储过程,首先必须指定返回结果集的条记录数,可以用临时表,也可以用table变量(2000),两个在性能上没有太大的差别,但是,table变量是存储在内存中的,如果你的服务器内存不多的话,可以考虑用临时表,临时表使用硬盘存储结果,临时表需要手工释放对象,而table变量在存储过程结束后自动释放。
    下面就是我们要创建的存储过程:

createprocGetAuthors
@Author_Last_Nameasvarchar(100)=null,
@StartRowasint=null,
@StopRowasint=null
AS

----建立有标识符列的table变量
declare@t_tabletable
(
[rownum][int]IDENTITY(1,1)PrimarykeyNOTNULL,
[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行数之后停止处理查询
SetRowCount@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]

FROMauthors
WHEREAuthor_Last_Namelike'%'+@Author_Last_Name+'%'
ORDERBYAuthor_Last_Name

----返回到正确的结果
SELECT*FROM@t_tableWHERErownum>=@StartRow
ORDERBYrownum

GO

    参数@StartRow和@StopRow接收整数值,代表要返回的开始记录和结束记录,如果要在一个25条记录的页面中返回第4页,我们就可以设置@StartRow为76,@StopRow为100。我们在table变量@t_table中定义了一个叫rownum的整数类型的列,并指定为标识符列,这个列在我们这里介绍的分页技术中是很重要的,当我们插入数据时,这个列自动增加,它将在插入数据时起排序作用。SETROWCOUNT语句对优化性能很关键,它告诉SQLServer进行限制要插入的数据,如果我们要76-100条记录之间的数据,那么就可以不必插入大于100条记录的数据。最后的SQL语句从@t_tabletable变量选择rownum大于或者等于@StartRow的那些数据集,然后把它们返回到Web服务器,由Web服务器绑定到DataGrid对象。值得注意的是:如果要得到76到100条记录的数据,我们必须往table变量中插入100条记录的数据,这意味着:如果浏览者请求的页数越来越大,页面性能也会有所下降的。例如:要显示第100页的数据(从第2451条记录到第2500条记录),我们必须先向table变量或者临时表填充2500条记录,因此,性能依赖于你计算机的和你要返回的记录数,有测试表明,在SQLServer2000中使用这样的存储过程平均在200-250毫秒内返回第100页,而返回第一页只需要4毫秒。即使返回第500页的数据(从第12451到12500条记录)也可以在650到750毫秒内完成。应该说这种情况是很少见到的。但为了减轻和网络传输的压力,合理的查询结果页数是很见效的。

摘自http://dotnet.aspx.cc/ShowDetail.aspx?id=108B1516-53CE-4357-B061-17295AF9689F

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>