說明:1.支持多表查詢 2.支持任意排序 3.不支持表別名
專注于為中小企業(yè)提供成都網(wǎng)站建設、成都網(wǎng)站設計服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)白云鄂免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
參考了
evafly920:[分享]千萬數(shù)量級分頁存儲過程(效果演示)
地址:
IF(EXISTS(SELECT * FROM sysobjects WHERE [id]=OBJECT_ID('usp_PagingLarge') AND xtype='P'))
DROP PROCEDURE usp_PagingLarge
*/
GO
CREATE PROCEDURE usp_PagingLarge
@TableNames VARCHAR(200), --表名,可以是多個表,但不能用別名
@PrimaryKey VARCHAR(100), --主鍵,可以為空,但@Order為空時該值不能為空
@Fields VARCHAR(200), --要取出的字段,可以是多個表的字段,可以為空,為空表示select *
@PageSize INT, --每頁記錄數(shù)
@CurrentPage INT, --當前頁,0表示第1頁
@Filter VARCHAR(200) = '', --條件,可以為空,不用填 where
@Group VARCHAR(200) = '', --分組依據(jù),可以為空,不用填 group by
@Order VARCHAR(200) = '' --排序,可以為空,為空默認按主鍵升序排列,不用填 order by
AS
BEGIN
DECLARE @SortColumn VARCHAR(200)
DECLARE @Operator CHAR(2)
DECLARE @SortTable VARCHAR(200)
DECLARE @SortName VARCHAR(200)
IF @Fields = ''
SET @Fields = '*'
IF @Filter = ''
SET @Filter = 'WHERE 1=1'
ELSE
SET @Filter = 'WHERE ' + @Filter
IF @Group ''
SET @Group = 'GROUP BY ' + @Group
IF @Order ''
BEGIN
DECLARE @pos1 INT, @pos2 INT
SET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')
IF CHARINDEX(' DESC', @Order) 0
IF CHARINDEX(' ASC', @Order) 0
BEGIN
IF CHARINDEX(' DESC', @Order) CHARINDEX(' ASC', @Order)
SET @Operator = '='
ELSE
SET @Operator = '='
END
ELSE
SET @Operator = '='
ELSE
SET @Operator = '='
SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC', ''), ' ', '')
SET @pos1 = CHARINDEX(',', @SortColumn)
IF @pos1 0
SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)
SET @pos2 = CHARINDEX('.', @SortColumn)
IF @pos2 0
BEGIN
SET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)
IF @pos1 0
SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1)
ELSE
SET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2)
END
ELSE
BEGIN
SET @SortTable = @TableNames
SET @SortName = @SortColumn
END
END
ELSE
BEGIN
SET @SortColumn = @PrimaryKey
SET @SortTable = @TableNames
SET @SortName = @SortColumn
SET @Order = @SortColumn
SET @Operator = '='
END
DECLARE @type varchar(50)
DECLARE @prec int
SELECT @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name = @SortTable AND c.name = @SortName
IF CHARINDEX('char', @type) 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')'
DECLARE @TopRows INT
SET @TopRows = @PageSize * @CurrentPage + 1
print @TopRows
print @Operator
EXEC('
DECLARE @SortColumnBegin ' + @type + '
SET ROWCOUNT ' + @TopRows + '
SELECT @SortColumnBegin=' + @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' ORDER BY ' + @Order + '
SET ROWCOUNT ' + @PageSize + '
SELECT ' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' ORDER BY ' + @Order + '
')
END
GO
--調(diào)用例子:
--1.單表/單排序
EXEC usp_PagingLarge 'bigtable','d_id','d_id,d_title,d_content,d_time',20,1,'','','d_id desc'
--2.單表/多排序
EXEC usp_PagingLarge 'bigtable','d_id','*',20,0,'','','d_time asc,d_id desc'
--3.多表/單排序
EXEC usp_PagingLarge 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_id asc'
--4.多表/多排序
EXEC usp_PagingLarge 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_time asc,bigtable.d_id desc'
與自定義分頁結(jié)合例子:
/Files/jiny-z/Paging_Custom.rar
alter PROCEDURE SP_Pagination
/**//*
***************************************************************
** 分頁存儲過程 **
***************************************************************
參數(shù)說明:
1.Tables :表名稱,視圖
2.PrimaryKey :主關鍵字
3.Sort :排序語句,不帶Order By 比如:NewsID Desc,OrderRows Asc
4.CurrentPage :當前頁碼
5.PageSize :分頁尺寸
6.Fields:字段
6.Filter :過濾語句,不帶Where
7.Group :Group語句,不帶Group By
8.docount: 1返回總行數(shù),0返回列表
***************************************************************/
(
@Tables varchar(1000),
@PrimaryKey varchar(100),
@Sort varchar(200) = NULL,
@CurrentPage int = 1,
@PageSize int = 10,
@Fields varchar(1000) = '*',
@Filter varchar(1000) = NULL,
@Group varchar(1000) = NULL,
@docount bit = 0
)
AS
/**//*默認排序*/
IF @Sort IS NULL OR @Sort = ''
SET @Sort = @PrimaryKey
DECLARE @SortTable varchar(100)
DECLARE @SortName varchar(100)
DECLARE @strSortColumn varchar(200)
DECLARE @operator char(2)
DECLARE @type varchar(100)
DECLARE @prec int
/**//*設定排序語句.*/
IF CHARINDEX('DESC',@Sort)0
BEGIN
SET @strSortColumn = REPLACE(@Sort, 'DESC', '')
SET @operator = '='
END
ELSE
BEGIN
IF CHARINDEX('ASC', @Sort) = 0
SET @strSortColumn = REPLACE(@Sort, 'ASC', '')
SET @operator = '='
END
IF CHARINDEX('.', @strSortColumn) 0
BEGIN
SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
END
ELSE
BEGIN
SET @SortTable = @Tables
SET @SortName = @strSortColumn
END
SELECT @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name = @SortTable AND c.name = @SortName
IF CHARINDEX('char', @type) 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')'
DECLARE @strPageSize varchar(50)
DECLARE @strStartRow varchar(50)
DECLARE @strFilter varchar(200)
DECLARE @strSimpleFilter varchar(200)
DECLARE @strGroup varchar(200)
/**//*默認當前頁*/
IF @CurrentPage 1
SET @CurrentPage = 1
/**//*設置分頁參數(shù).*/
SET @strPageSize = CAST(@PageSize AS varchar(50))
SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(50))
/**//*篩選以及分組語句.*/
IF @Filter IS NOT NULL AND @Filter != ''
BEGIN
SET @strFilter = ' WHERE ' + @Filter + ' '
SET @strSimpleFilter = ' AND ' + @Filter + ' '
END
ELSE
BEGIN
SET @strSimpleFilter = ''
SET @strFilter = ''
END
IF @Group IS NOT NULL AND @Group != ''
SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
SET @strGroup = ''
declare @cTemp NVarChar(1000)
declare @PageCount int, @lineCount decimal
CREATE TABLE #temp(linecount INT)
set @cTemp = 'insert into #temp (linecount) select count(*) FROM ' + @Tables + @strFilter + ' ' + @strGroup
exec (@cTemp)
select @lineCount = linecount from #temp
drop table #temp
if(@docount=1)
begin
select @lineCount '總行數(shù)'
end
else
begin
--得到總頁數(shù)
set @PageCount = CEILING(@lineCount/@strPageSize)
if @CurrentPage @PageCount
begin
set @cTemp = 'SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE 12 '
end
else
begin
/**//*執(zhí)行查詢語句*/
set @cTemp = 'DECLARE @SortColumn ' + @type + '
SET ROWCOUNT ' + @strStartRow + '
SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
SET ROWCOUNT ' + @strPageSize + '
SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ''
end
--print @cTemp
EXEC(@cTemp)
end
-----------------------------------------------------
分頁查詢的方法已經(jīng)很多很多,在這里我也加入成為其中一員。
SQL Server中有一個Set Rowcount的的設置,它的意思是使命令的處理在響應指定的行數(shù)之后停止處理命令,利用這個特點,我們可以借用它來在一個千萬行級數(shù)據(jù)表中實現(xiàn)高性能分頁查詢。先來說說實現(xiàn)方式:
1、我們來假定Table中有一個已經(jīng)建立了索引的主鍵字段ID(整數(shù)型),我們將按照這個字段來取數(shù)據(jù)進行分頁。
2、頁的大小我們放在@PageSize中
3、當前頁號我們放在@CurrentPage中
4、如何讓記錄指針快速滾動到我們要取的數(shù)據(jù)開頭的那一行呢,這是關鍵所在!有了Set RowCount,我們就很容易實現(xiàn)了。
5、如果我們成功地滾動記錄指針到我們要取的數(shù)據(jù)的開頭的那一行,然后我們把那一行的記錄的ID字段的值記錄下來,那么,利用Top和條件,我們就很容易的得到指定頁的數(shù)據(jù)了。當然,有了Set RowCount,我們難道還用Top么?
看看Set Rowcount怎么來幫我們的忙吧:
Declare @ID int
Declare @MoveRecords int
--@CurrentPage和@PageSize是傳入?yún)?shù)
Set @MoveRecords=@CurrentPage * @PageSize+1
--下面兩行實現(xiàn)快速滾動到我們要取的數(shù)據(jù)的行,并把ID記錄下來
Set Rowcount @MoveRecords
Select @ID=ID from Table1 Order by ID
Set Rowcount @PageSize
--最恨為了減少麻煩使用*了,但是在這里為了說明方便,暫時用一下
Select * From Table1 Where ID=@ID Order By ID
Set Rowcount 0
大家可以試試看,在一個1千W記錄的表里面,一下子方翻頁到第100頁(每頁100條),看看有多快!
分享]千萬數(shù)量級分頁存儲過程(帶效果演示)
效果演示:
CREATE PROCEDURE CN5135_SP_Pagination
/**//*
***************************************************************
** 千萬數(shù)量級分頁存儲過程 **
***************************************************************
參數(shù)說明:
1.Tables :表名稱,視圖
2.PrimaryKey :主關鍵字
3.Sort :排序語句,不帶Order By 比如:NewsID Desc,OrderRows Asc
4.CurrentPage :當前頁碼
5.PageSize :分頁尺寸
6.Filter :過濾語句,不帶Where
7.Group :Group語句,不帶Group By
效果演示:
***************************************************************/
(
@Tables varchar(1000),
@PrimaryKey varchar(100),
@Sort varchar(200) = NULL,
@CurrentPage int = 1,
@PageSize int = 10,
@Fields varchar(1000) = '*',
@Filter varchar(1000) = NULL,
@Group varchar(1000) = NULL
)
AS
/**//*默認排序*/
IF @Sort IS NULL OR @Sort = ''
SET @Sort = @PrimaryKey
DECLARE @SortTable varchar(100)
DECLARE @SortName varchar(100)
DECLARE @strSortColumn varchar(200)
DECLARE @operator char(2)
DECLARE @type varchar(100)
DECLARE @prec int
/**//*設定排序語句.*/
IF CHARINDEX('DESC',@Sort)0
BEGIN
SET @strSortColumn = REPLACE(@Sort, 'DESC', '')
SET @operator = '='
END
ELSE
BEGIN
IF CHARINDEX('ASC', @Sort) = 0
SET @strSortColumn = REPLACE(@Sort, 'ASC', '')
SET @operator = '='
END
IF CHARINDEX('.', @strSortColumn) 0
BEGIN
SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
END
ELSE
BEGIN
SET @SortTable = @Tables
SET @SortName = @strSortColumn
END
SELECT @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name = @SortTable AND c.name = @SortName
IF CHARINDEX('char', @type) 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')'
DECLARE @strPageSize varchar(50)
DECLARE @strStartRow varchar(50)
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
DECLARE @strGroup varchar(1000)
/**//*默認當前頁*/
IF @CurrentPage 1
SET @CurrentPage = 1
/**//*設置分頁參數(shù).*/
SET @strPageSize = CAST(@PageSize AS varchar(50))
SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(50))
/**//*篩選以及分組語句.*/
IF @Filter IS NOT NULL AND @Filter != ''
BEGIN
SET @strFilter = ' WHERE ' + @Filter + ' '
SET @strSimpleFilter = ' AND ' + @Filter + ' '
END
ELSE
BEGIN
SET @strSimpleFilter = ''
SET @strFilter = ''
END
IF @Group IS NOT NULL AND @Group != ''
SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
SET @strGroup = ''
/**//*執(zhí)行查詢語句*/
EXEC(
'
DECLARE @SortColumn ' + @type + '
SET ROWCOUNT ' + @strStartRow + '
SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
SET ROWCOUNT ' + @strPageSize + '
SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
'
)
GO
注:
1)如表名參數(shù)為多表連接時,sort列必須指定表名;
2)只支持單字段排序,有朋友如果問為什么不做成可以多字段排序的,理論上確實有這種可能性,但需要以一定的效率損失為代價,而且會使方法過于復雜,如真有這種需要,完全可以寫一個單獨的分頁存儲過程,無論在性能還是復雜度上都比通用要簡單.
建立access的數(shù)據(jù)庫news,還有表news,表的字段(id,title),id唯一,輸入數(shù)據(jù)保存,用下面代碼可查詢,可分頁
-----------------------下面保存為search.asp--------------------------
html
head
meta http-equiv="Content-Type" content="text/html; charset=gb2312"
title文件/title
/head
body bgcolor="#ffffff"
!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
script
function btn_ck_bh_Click()
{
var cx = document.form1.cxsj.value;
form1.action ="search.asp?cx="+cx;
}
/script
table border="1" cellspacing="0" bgcolor="#F0F8FF" bordercolorlight="#4DA6FF" bordercolordark="#ECF5FF" width="88%" style="word-break:break-all"
tr
td width="778" align="center" colspan="7"
form method="POST" name="form1" action=search.asp
p輸入搜索內(nèi)容:input type="text" name="cxsj" size="20"input type="submit" value="提交" name="B1" LANGUAGE="javascript" onclick="btn_ck_bh_Click()"
input type="reset" value="重寫" name="B2"/p
/form
/td
/tr
/table
table border="1" cellspacing="0" bgcolor="#F0F8FF" bordercolorlight="#4DA6FF" bordercolordark="#ECF5FF" width="88%" style="word-break:break-all"
tr
td width="8%" align="center"strongfont color="#0080C0"ID 號/font/strong/td
td width="58%" align="center"strongfont color="#0080C0"標 題/font/strong/td
td width="8%" align="center"strongfont color="#0080C0"修 改/font/strong/td
td width="8%" align="center"strongfont color="#0080C0"刪 除/font/strong/td
/tr
%
'數(shù)據(jù)庫查詢
'獲得搜索內(nèi)容
cx = request("cx")
dim pageCount
'把page轉(zhuǎn)換成整數(shù)
page = cint(request("page"))
set conn=server.createobject("adodb.connection")'
set rs=server.createobject("adodb.recordset")
conn.open "DBQ=" server.mappath("./news.mdb") ";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
' 獲取產(chǎn)品的名字記錄集(從 news表中)
if cx "" then
sql = "select * from news where title like '%"cx "%' order by id desc"
else
sql ="select * from news order by id desc"
end if
rs.open sql,conn,3,3
'如果沒有數(shù)據(jù)記錄
if rs.bof then
errmsg=errmsg+"br"+"li"+keyword+"沒有記錄,請返回!!"
response.write errmsg
response.end
end if
' 設置記錄集在每頁的總行數(shù),也就是 PageSize屬性
RS.PageSize=40
'把rs.pageCount轉(zhuǎn)換成整數(shù)和page才能作比較
pageCount = cint(rs.pageCount)
' 設置當前的頁號( AbsolutePage屬性)
if page = 0 then
page =1
end if
RS.AbsolutePage = page
x=1
' 顯示當前頁中的所有記錄( PageSize中設置的行數(shù))
WHILE NOT RS.EOF AND NumRowsRS.PageSize
%
tr onmouseover="this.bgColor='#99ccff'" onmouseout="this.bgColor=''"
td width="8%"p align="center"%=rs("id")%/td
td width="58%"a href="view.asp?id=%=rs("id")%" target="_blank"%=rs("title")%/a/td
td width="8%" align="center"a href="edit.asp?id="%=rs("id")%修 改/a/td
td width="8%" align="center"a href="delet.asp?id="%=rs("id")%刪 除/a/td
/tr
%RS.MoveNext
NumRows=NumRows+1
WEND%
tr onmouseover="this.bgColor='#99ccff'" onmouseout="this.bgColor=''"
td width="105%" align="center" colspan="6" /td /tr
tr
td width="105%" align="center" colspan="6"
p align="center"FONT color=#333333共%=PageCount%頁 第%=page%頁★
%if page=1 then%首頁%end if%
%if page1 then%
A HREF="search.asp?page=1cx=%=cx%" 首頁/A
%end if%★
%if page1 then%A HREF="search.asp?page=%=page-1%cx=%=cx%"%end if%上一頁/a
%
dim pagewhere
dim p
p = 1
'把pagewhere轉(zhuǎn)換成整數(shù)
'pagewhere = cint(request("pagewhere"))
pagewhere = pageCount
if pagewhere0 then
for p=1 to pagewhere
if p page then%
A HREF="search.asp?page=%=p%cx=%=cx%"%=p%/a
%end if
if p =page then%
%=p%
% end if
next
end if%
%if page PageCount then%
A HREF="search.asp?page=%=page+1%cx=%=cx%"
%end if %下一頁/A★
%if page=PageCount then%尾頁
%end if%
%if pagePageCount then%
A HREF="search.asp?page=%=PageCount%cx=%=cx%" 尾頁/A
%end if%
/p/FONT/td /tr tr
td width="105%" align="center" colspan="6"搜索內(nèi)容:%=cx%/td
/tr
/table/center/div
/body/html
%
rs.close
Set rs=nothing
conn.close
set conn=nothing
%
分頁存儲過程如果按主鍵來排序,速度還是比較快的,但是如果按照LIKE條件查詢字符串,那速度會下降很多,排序字段是個非常關鍵的因素,提供一個存儲過程,調(diào)用這個存儲賽程就可以了,參考如下:
CREATE PROC proc_pageview
@tbname sysname, --要分頁顯示的表名
@FieldKey nvarchar(1000), --用于定位記錄的主鍵(惟一鍵)字段,可以是逗號分隔的多個字段
@PageCurrent int=1, --要顯示的頁碼
@PageSize int=10, --每頁的大小(記錄數(shù))
@FieldShow nvarchar(1000)='', --以逗號分隔的要顯示的字段列表,如果不指定,則顯示所有字段
@FieldOrder nvarchar(1000)='', --以逗號分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
@Where varchar(1000)='', --查詢條件
@RecordCount int OUTPUT --總頁數(shù)
AS
SET NOCOUNT ON
--檢查對象是否有效
IF OBJECT_ID(@tbname) IS NULL
BEGIN
RAISERROR(N'對象"%s"不存在',1,16,@tbname)
RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
RAISERROR(N'"%s"不是表、視圖或者表值函數(shù)',1,16,@tbname)
RETURN
END
--分頁字段檢查
IF ISNULL(@FieldKey,N'')=''
BEGIN
RAISERROR(N'分頁處理需要主鍵(或者惟一鍵)',1,16)
RETURN
END
--其他參數(shù)檢查及規(guī)范
IF ISNULL(@PageCurrent,0)1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
IF ISNULL(@FieldOrder,N'')=N''
SET @FieldOrder=N''
ELSE
SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
IF ISNULL(@Where,N'')=N''
SET @Where=N''
ELSE
SET @Where=N'WHERE ('+@Where+N')'
--如果@PageCount為NULL值,則計算總頁數(shù)(這樣設計可以只在第一次計算總頁數(shù),以后調(diào)用時,把總頁數(shù)傳回給存儲過程,避免再次計算總頁數(shù),對于不想計算總頁數(shù)的處理而言,可以給@PageCount賦值)
IF @RecordCount IS NULL
BEGIN
DECLARE @sql nvarchar(4000)
SET @sql=N'SELECT @RecordCount=COUNT(*)'
+N' FROM '+@tbname
+N' '+@Where
EXEC sp_executesql @sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT
END
--計算分頁顯示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
@TopN1=(@PageCurrent-1)*@PageSize
--第一頁直接顯示
IF @PageCurrent=1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder)
ELSE
BEGIN
--處理別名
IF @FieldShow=N'*'
SET @FieldShow=N'a.*'
--生成主鍵(惟一鍵)處理條件
DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
@s nvarchar(1000),@Field sysname
SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
WHILE CHARINDEX(N',',@s)0
SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
@Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
@Where=REPLACE(@Where,@Field,N'a.'+@Field),
@FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
@FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
SELECT @Where=REPLACE(@Where,@s,N'a.'+@s),
@FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
@FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
@Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),
@Where2=CASE
WHEN @Where='' THEN N'WHERE ('
ELSE @Where+N' AND ('
END+N'b.'+@s+N' IS NULL'+@Where2+N')'
--執(zhí)行查詢
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' a LEFT JOIN(SELECT TOP '+@TopN1
+N' '+@FieldKey
+N' FROM '+@tbname
+N' a '+@Where
+N' '+@FieldOrder
+N')b ON '+@Where1
+N' '+@Where2
+N' '+@FieldOrder)
END
GO
當客戶端在 發(fā)出POST請求時/albums,您希望將請求正文中描述的專輯添加到現(xiàn)有專輯數(shù)據(jù)中。
為此,您將編寫以下內(nèi)容:
1、編寫代碼
a.添加代碼以將專輯數(shù)據(jù)添加到專輯列表。
在此代碼中:
1)用于Context.BindJSON 將請求正文綁定到newAlbum。
2) album將從 JSON 初始化的結(jié)構附加到albums 切片。
3)向響應添加201狀態(tài)代碼,以及表示您添加的專輯的 JSON。
b.更改您的main函數(shù),使其包含該router.POST函數(shù),如下所示。
在此代碼中:
1)將路徑中的POST方法與 /albumspostAlbums函數(shù)相關聯(lián)。
使用 Gin,您可以將處理程序與 HTTP 方法和路徑組合相關聯(lián)。這樣,您可以根據(jù)客戶端使用的方法將發(fā)送到單個路徑的請求單獨路由。
a.如果服務器從上一節(jié)開始仍在運行,請停止它。
b.從包含 main.go 的目錄中的命令行,運行代碼。
c.從不同的命令行窗口,用于curl向正在運行的 Web 服務發(fā)出請求。
該命令應顯示添加專輯的標題和 JSON。
d.與上一節(jié)一樣,使用curl檢索完整的專輯列表,您可以使用它來確認添加了新專輯。
該命令應顯示專輯列表。
當客戶端向 發(fā)出請求時GET /albums/[id],您希望返回 ID 與id路徑參數(shù)匹配的專輯。
為此,您將:
a.在您在上一節(jié)中添加的函數(shù)下方postAlbums,粘貼以下代碼以檢索特定專輯。
此getAlbumByID函數(shù)將提取請求路徑中的 ID,然后找到匹配的專輯。
在此代碼中:
(1)Context.Param用于從 URL 中檢索id路徑參數(shù)。當您將此處理程序映射到路徑時,您將在路徑中包含參數(shù)的占位符。
(2)循環(huán)album切片中的結(jié)構,尋找其ID 字段值與id參數(shù)值匹配的結(jié)構。如果找到,則將該album結(jié)構序列化為 JSON,并將其作為帶有200 OK HTTP 代碼的響應返回。
如上所述,實際使用中的服務可能會使用數(shù)據(jù)庫查詢來執(zhí)行此查找。
(3)如果找不到專輯,則返回 HTTP 404錯誤。
b.最后,更改您的main,使其包含對router.GET的新調(diào)用,路徑現(xiàn)在為/albums/:id ,如以下示例所示。
在此代碼中:
(1)將/albums/:id路徑與getAlbumByID功能相關聯(lián)。在 Gin 中,路徑中項目前面的冒號表示該項目是路徑參數(shù)。
a.如果服務器從上一節(jié)開始仍在運行,請停止它。
b.在包含 main.go 的目錄中的命令行中,運行代碼以啟動服務器。
c.從不同的命令行窗口,用于curl向正在運行的 Web 服務發(fā)出請求。
該命令應顯示您使用其 ID 的專輯的 JSON。如果找不到專輯,您將收到帶有錯誤消息的 JSON。
恭喜!您剛剛使用 Go 和 Gin 編寫了一個簡單的 RESTful Web 服務。
本節(jié)包含您使用本教程構建的應用程序的代碼。
collection.find().toArray(function(err,docs){
console.log(docs);
//將數(shù)據(jù)顯示到網(wǎng)頁上
// console.log('1'+docs[0].name);
// $('#question').append('div'+docs+'/div');
// document.getElementById("editLevels").value =docs;
分頁例子,對大量數(shù)據(jù)不行,
大量據(jù)數(shù)要用存儲過程
%
'連接數(shù)據(jù)庫
'執(zhí)行sql 改你要的sql
set rs=server.CreateObject("adodb.recordset")%
rs.open "select * from news order by id desc ",conn,1,3
下面的代碼就復制用可以了
'分頁
i=50
rs.pagesize=i
pu=request("pu")
if pu="" then pu=1
if cint(pu)="0" then pu=1
if cint(pu)rs.pagecount then pu=rs.pagecount
if not rs.eof then rs.absolutepage=cint(pu)
'顯示記錄
if not rs.eof then
do while not rs.eof and i=1
response.write rs("字段")'顯示字段
'就這里改你要的,其它復制用就可以
rs.movenext
i=i-1
loop
end if
%
當前第 %=pu% 頁;分
%=rs.pagecount% 頁;
共 %=rs.recordcount% 條記錄;
每頁%=i%條記錄
a href="?pu=1"首 頁/a
a href="?pu=%=cint(PU)-1%"上一頁/a
a href="?pu=%=cint(PU)+1%"下一頁/a
a href="?pu=%=rs.pagecount%"末 頁/a
--------------------------------------
asp+存儲分頁,看一下實現(xiàn)的方法,自己就可以寫了
/////////////////分頁的代碼/////////////
use pubs
go
create proc get23
@pageSize int,
@currentPage int,
@totalPage int output
as
declare @strQuery as varchar(1000)
declare @rowCount as int
select @rowCount=count(title_id)from titles
set @totalPage=CEILING(CAST(@rowCount AS FLOAT)/CAST(@pageSize AS FLOAT))
if @currentPage1
begin
if @currentPage@totalPage
begin
set @currentPage=@totalPage
end
set @strQuery='select top '+cast(@pageSize as varchar
(10))+ ' * from titles
where title_id not in(select top '+cast(@pageSize*(@currentPage-1)as varchar(10))+' title_id from titles order by
title_id)
order by title_id'
end
else
begin
set @strQuery='select top '+cast(@pageSize as varchar(10))+'
* from userinfo order by userID'
end
exec (@strQuery)
go
運行代碼如下,正確運行,declare @total int
exec get23 2,2,@total output
print'總頁數(shù)為:'+cast(@total as varchar(6))+'頁'
/////////////////分頁的代碼/////////////