[解决办法] set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO /* 分页排序存储过程 V1.0 */
ALTER procedure [dbo].[sp_KeyPage] @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 --检查对象是否有效 IF OBJECT_ID(@tbname) IS NULL --OBJECT_ID 功能:返回数据库对象的标识号 BEGIN RAISERROR(N'对象"%s"不存在',1,16,@tbname) RETURN END IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0 --OBJECTPROPERTY 功能:返回当前数据库中对象的有关信息。 AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0 AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0 BEGIN RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname) RETURN END --分页字段检查 IF ISNULL(@FieldKey,N'')='' BEGIN RAISERROR(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'' 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值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值) IF @PageCount IS NULL BEGIN DECLARE @sql nvarchar(4000) SET @sql=N'SELECT @PageCount=COUNT(*)' +N' FROM '+@tbname +N' '+@Where EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT SET @PageCount=(@PageCount+@PageSize-1)/@PageSize 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')' --执行查询 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
一个比较实用的大数据量分页存储过程 该文章转载自德仔工作室:http://www.dezai.cn/article_show.asp?ArticleID=12877 [解决办法] 学习 [解决办法] 帮顶一下 [解决办法] 楼主找到合适的答案麻烦分享一下哦. [解决办法] mark [解决办法] 做个记号 [解决办法] 我现在都是用的存储过程。个人感觉不错。希望楼主找到自己理想的。。 [解决办法] mark [解决办法] 不知道这个行不?其实没有什么是万能的,自己觉得用得习惯就好
SQL code
CREATE PROCEDURE sp_member_get_firend_list @id bigint, @pagesize int, @pageindex int, @docount bit, @condition varchar(100) AS set nocount on if(@docount=1) exec(' SELECT count(*) from web_Clients a inner join web_Clients_Partners b on a.ClientID=PartnerID where b.ClientID='+@id+@condition) else begin declare @PageLowerBound int declare @PageUpperBound int set @PageLowerBound=(@pageindex-1)*@pagesize set @PageUpperBound=@PageLowerBound+@pagesize set rowcount @PageUpperBound set @PageLowerBound=@PageLowerBound+1 exec('declare @indextable table(id int identity(1,1),nid int) insert into @indextable(nid) select a.ClientID from web_Clients a inner join web_Clients_Partners b on a.ClientID=PartnerID where b.ClientID='+@id+@condition+' order by b.AddDate desc select a.ClientID as userid,ClientName as username,ClientAliasName,contactMan,phone,mobiphone, (select distinct DName from Common_DCode c where c.dCode=a.AreaCode) ProvName, b.StatusCode,RelationCode,b.AddDate,CleintTypesCode from web_Clients a inner join web_Clients_Partners b on a.ClientID=PartnerID , @indextable t WHERE b.ClientID='+@id+@condition+' and a.ClientID=t.nid and t.id between '+@PageLowerBound+' and '+@PageUpperBound+' order by t.id ') endset nocount offGO