各种 分页存储过程整理
生活随笔
收集整理的這篇文章主要介紹了
各种 分页存储过程整理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、TOP n 實現的通用分頁存儲過程(轉自鄒建)
CREATE PROC sp_PageView @tbname sysname, --要分頁顯示的表名 @FieldKey nvarchar(1000), --用于定位記錄的主鍵(惟一鍵)字段,可以是逗號分隔的多個字段 @PageCurrent int=1, --要顯示的頁碼 @PageSize int=10, --每頁的大小(記錄數) @FieldShow nvarchar(1000)='', --以逗號分隔的要顯示的字段列表,如果不指定,則顯示所有字段 @FieldOrder nvarchar(1000)='', --以逗號分隔的排序字段列表,可以指定在字段后面指定DESC/ASC 用于指定排序順序 @Where nvarchar(1000)='', --查詢條件 @PageCount int OUTPUT --總頁數 AS SET NOCOUNT ON --檢查對象是否有效 IF OBJECT_ID(@tbname) IS NULL BEGINRAISERROR(N'對象"%s"不存在',1,16,@tbname)RETURN END IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0 BEGINRAISERROR(N'"%s"不是表、視圖或者表值函數',1,16,@tbname)RETURN END--分頁字段檢查 IF ISNULL(@FieldKey,N'')='' BEGINRAISERROR(N'分頁處理需要主鍵(或者惟一鍵)',1,16)RETURN END--其他參數檢查及規范 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'' ELSESET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder) IF ISNULL(@Where,N'')=N''SET @Where=N'' ELSESET @Where=N'WHERE ('+@Where+N')'--如果@PageCount為NULL值,則計算總頁數(這樣設計可以只在第一次計算總頁數,以后調用時,把總頁數傳回給存儲過程,避免再次計算總頁數,對于不想計算總頁數的處理而言,可以給@PageCount賦值) IF @PageCount IS NULL BEGINDECLARE @sql nvarchar(4000)SET @sql=N'SELECT @PageCount=COUNT(*)'+N' FROM '+@tbname+N' '+@WhereEXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUTSET @PageCount=(@PageCount+@PageSize-1)/@PageSize END--計算分頁顯示的TOPN值 DECLARE @TopN varchar(20),@TopN1 varchar(20) SELECT @TopN=@PageSize,@TopN1=(@PageCurrent-1)*@PageSize--第一頁直接顯示 IF @PageCurrent=1EXEC(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 sysnameSELECT @Where1=N'',@Where2=N'',@s=@FieldKeyWHILE CHARINDEX(N',',@s)>0SELECT @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=CASEWHEN @Where='' THEN N'WHERE ('ELSE @Where+N' AND ('END+N'b.'+@s+N' IS NULL'+@Where2+N')'--執行查詢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?
二、字符串緩存實現的通用分頁存儲過程(轉自鄒建)
?
三、使用系統存儲過程實現的通用分頁存儲過程(轉自鄒建)
?
四、SQL 2005的ROW_NUMBER()實現分頁功能
?
五、使用內存表
create proc Proc_paged (@pagesize int,@pagenum int,@pagecount int output ) as begin --聲明變量 declare @tmptable table(id int identity (1,1),userid nchar(5)) declare @idBengin int declare @idend int --構造內存表 insert into @tmptable (userid )(select userid from users) select @pagecount=count(*) from @tmptable if(@pagecount%@pagesize>0) set @pagecount=@pagecount/@pagesize+1 else set @pagecount=@pagecount/@pagesize set @idBengin=(@pagenum-1)*@pagesize set @idend=@idBengin+@pagesize select t2.id,t1.* from users t1,@tmptable t2 where t1.userid=t2.userid andt2.id>@idBengin and t2.id<=@idend end?
六、SQL 2005 版本 通用分頁存儲過程
Create PROCEDURE [dbo].[Pagination] @Page int = 1, -- 當前頁碼 @PageSize int = 10, -- 每頁記錄條數(頁面大小) @Table nvarchar(500), -- 表名或視圖名,甚至可以是嵌套SQL:(Select * From Tab Where ID>1000) Tab @Field nvarchar(200) = '*', -- 返回記錄集字段名,","隔開,默認是"*" @OrderBy nvarchar(100) = 'ID ASC', -- 排序規則 @Filter nvarchar(500), -- 過濾條件 @MaxPage smallint output, -- 執行結果 -1 error, 0 false, maxpage true @TotalRow int output, -- 記錄總數 /* 2007-07-12 22:11:00 update */ @Descript varchar(100) output -- 結果描述 AS BEGIN Set ROWCOUNT @PageSize;Set @Descript = 'successful'; -------------------參數檢測---------------- IF LEN(RTRIM(LTRIM(@Table))) !> 0 BeginSet @MaxPage = 0;Set @Descript = 'table name is empty';Return; EndIF LEN(RTRIM(LTRIM(@OrderBy))) !> 0 BeginSet @MaxPage = 0;Set @Descript = 'order is empty';Return; EndIF ISNULL(@PageSize,0) <= 0 BeginSet @MaxPage = 0;Set @Descript = 'page size error';Return; EndIF ISNULL(@Page,0) <= 0 BeginSet @MaxPage = 0;Set @Descript = 'page error';Return; End -------------------檢測結束----------------Begin Try-- 整合SQLDeclare @SQL nvarchar(4000), @Portion nvarchar(4000);Set @Portion = ' ROW_NUMBER() OVER (ORDER BY ' + @OrderBy + ') AS ROWNUM FROM ' + @Table;Set @Portion = @Portion + (CASE WHEN LEN(@Filter) >= 1 THEN (' Where ' + @Filter + ') AS tab') ELSE (') AS tab') END);Set @SQL = 'Select TOP(' + CAST(@PageSize AS nvarchar(8)) + ') ' + @Field + ' FROM (Select ' + @Field + ',' + @Portion;Set @SQL = @SQL + ' Where tab.ROWNUM > ' + CAST((@Page-1)*@PageSize AS nvarchar(8));-- 執行SQL, 取當前頁記錄集Execute(@SQL);---------------------------------------------------------------------- 整合SQLSet @SQL = 'Set @Rows = (Select MAX(ROWNUM) FROM (Select' + @Portion + ')';-- 執行SQL, 取最大頁碼Execute sp_executesql @SQL, N'@Rows int output', @TotalRow output;Set @MaxPage = (CASE WHEN (@TotalRow % @PageSize)<>0 THEN (@TotalRow / @PageSize + 1) ELSE (@TotalRow / @PageSize) END); End Try Begin Catch-- 捕捉錯誤Set @MaxPage = -1;Set @Descript = 'error line: ' + CAST(ERROR_LINE() AS varchar(8)) + ', error number: ' + CAST(ERROR_NUMBER() AS varchar(8)) + ', error message: ' + ERROR_MESSAGE();Return; End Catch;-- 執行成功 Return; END?
整理自:http://www.cnblogs.com/onlytiancai/archive/2009/03/26/1421956.html
轉載于:https://www.cnblogs.com/xufeiyang/articles/3245033.html
總結
以上是生活随笔為你收集整理的各种 分页存储过程整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软系统工具套件Sysinternals
- 下一篇: Android开发7——android.