要創建一個返回指定條記錄結果的存儲過程,首先必須指定返回結果集的條記錄數,可以用臨時表,也可以用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