1. 程式人生 > >SQL儲存過程分頁與遊標使用

SQL儲存過程分頁與遊標使用

儲存過程:
CREATE procedure p_splitpage    
@sql nvarchar(4000), --
要執行的sql語句
 
@page int=1,    --
要顯示的頁碼
 
@pageSize int,  --
每頁的大小
 
@pageCount int=0 out, --
總頁數
 
@recordCount int=0 out --
總記錄數
 
as 
set nocount on 
declare @p1 int 
exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@
[email protected]
output 

set @recordCount = @pageCount 
select @pagecount=ceiling(1.0*@pagecount/@pagesize) 
,@page=(@page-1)*@pagesize+1 
exec sp_cursorfetch @p1,16,@page,@pagesize  
exec sp_cursorclose @p1 
GO 

ASP
頁面的內容:
 
sql = "Select id, c_s_name from tabNews where deleted<>1 Order By id Desc" 

page = cint(page_get) 
if page_post<>""then 
page = cint(page_post) 
end if 
if not page > 0 then  
page = 1 
end if 
pagesize=20’
每頁的條數
 
set cmd = server.CreateObject("adodb.command") 
cmd.ActiveConnection = conn 
cmd.CommandType = 4 
cmd.CommandText = "p_SplitPage" 
cmd.Parameters.Append cmd.CreateParameter("@sql",8,1, 4000, sql) 
cmd.Parameters.Append cmd.CreateParameter("@page",4,1, 4, page) 
cmd.Parameters.Append cmd.CreateParameter("@pageSize",4,1, 4, pageSize) 
cmd.Parameters.Append cmd.CreateParameter("@pageCount",4,2, 4, pageCount) 
cmd.Parameters.Append cmd.CreateParameter("@recordCount",4,2, 4, recordCount) 
set rs = cmd.Execute 
set rs = rs.NextRecordSet 
pageCount = cmd.Parameters("@pageCount").value 
recordCount = cmd.Parameters("@recordCount").value 
if pageCount = 0 then pageCount = 1 
if page>pageCount then  
response.Redirect("?page="&pageCount)  
end if 

set rs = cmd.Execute 

遊標使用:

使用遊標的順序:聲名遊標、開啟遊標、讀取資料、關閉遊標、刪除遊標

CREATE PROCEDURE PK_Test

AS

--宣告個變數

declare @O_ID nvarchar(20)  

declare @A_Salary float


--宣告一個遊標mycursor

declare mycursor cursor for select O_ID,A_Salary from AddSalary

 

--開啟遊標

open mycursor

 

--從遊標裡取出資料(select語句中引數的個數必須要和從遊標取出的變數名相同)賦值到我們剛才宣告的個變數中

fetch next from mycursor into @O_ID,@A_Salary

 

/*//判斷遊標的狀態

//0 fetch語句成功   

//-1 fetch語句失敗或此行不在結果集中   

//-2被提取的行不存在*/ 

 

--迴圈一次次讀取遊標,得到@O_ID,@A_Salary的值

while (@@fetch_status=0)

 

--開始

begin

 

  --將@O_ID,@A_Salary 當做一個已知量,隨便使用。

  --顯示出我們每次用遊標取出的值

   print '遊標成功取出一條資料'

   print @O_ID

   print @A_Salary

 

--用遊標去取下一條記錄

   fetch next from mycursor into @O_ID,@A_Salary

end

 

 

--關閉遊標

close mycursor

--撤銷遊標

deallocate mycursor

GO