问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求个高效分页存储过程

发布网友 发布时间:2022-04-24 06:19

我来回答

1个回答

热心网友 时间:2022-05-05 12:08

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
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"不是表、视图或者表值函数',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追问试了一下 在高数据量下 查询有点慢 有解决方法吗?

如果在数据库中有大数据量,而我们用分页存储过程,怎么样才能效率高...

SELECT FROM databasetest t1 WHERE (SELECT count(*) FROM databasetest t2 WHERE t2.id &lt; t1.id) &gt;= 11 AND (SELECT count(*) FROM databasetest t2 WHERE t2.id &lt; t1.id) &lt; 20 花费时间: 62.156秒方法二:select from (select rownum as num,id,test1,test2 from databasetest a...

求一个sql存储过程分页。支持多表联合查询,模糊查询!

可以加个游标 使用更方便 PageCount bigint output,--总页数 Pages bigint output --当前页 as if @Pages&lt;=0 --判断页数 set @Pages=1 declare @指针定位 bigint set @指针定位=9*(@Pages-1)--这个是每页10条 declare @hid bigint,--获取定位Id 主要是用自增值判断的 余数 bigint--...

SQL如何实现数据分页,要具体语句,谢谢

分页存储过程如下 CREATE PROCEDURE GetRecordFromPage tblName varchar(255), -- 表名 RetColumns varchar(1000) = '*', -- 需要返回的列,默认为全部 Orderfld varchar(255), -- 排序字段名 PageSize int = 10, -- 页尺寸 PageIndex int = ...

多参数(条件)的分页存储过程 或 sql 语句

--自己写个简单的存储过程 alter procedure prGetPage (FName varchar(1000),--字段名 TName varchar(100),--表名 pageSize int,--每页显示多少条记录 pageIndex int,--当前页面索引 sortColumn varchar(100)--排序列 )as set nocount on declare strSql varchar(2000)set strSql='select top ...

网页分页,帮忙下

这里给你一个 全功能的数据库分页的存储过程。我自己弄得。看不懂直接按参数列表传参直接用用了。比较复杂。呵呵 --distinct 功能为去除重复数据 Create PROC SP_PAGER_list page_Index int,--我们要查看的页码,0代表的第一页 page_Size int,--页面记录数的大小 table_Name_join_on varchar(...

分页页数太多怎么处理?

分页存储过程如果按主键来排序,速度还是比较快的,但是如果按照LIKE条件查询字符串,那速度会下降很多,排序字段是个非常关键的因素,提供一个存储过程,调用这个存储赛程就可以了,参考如下:CREATE PROC proc_pageview tbname sysname, --要分页显示的表名 FieldKey nvarchar(1000), -...

Sql server2008怎样分页

你可以用存储过程分页,如下存储过程支持分页和排序:CREATE PROCEDURE GetSortedMovies (SortExpression NVarChar(100),StartRowIndex INT,MaximumRows INT )AS -- 创建一个临时表存储查询结果 CREATE TABLE #PageIndex (IndexId INT IDENTITY (1,1) NOT NULL,RecordId INT )-- 插入临时表 INSERT INTO ...

在一般处理程序中怎么实现分页

看到你的写的DataTable dt = ...,你有两种方式进行分页:1、前台在通过Ajax方式获取数据时,将页码通过?PageIndex=...的方式传入到后台函数,后台函数通过具体的页码和页面大小到数据库中获取指定的数据(在查询语句或存储过程中实现);2、如果数据量不大,可以一次取出来进行前台分页;...

高效的SQLSERVER分页查

根据测试结果,对于页数靠前的查询,方案3和4效率较高,而页数靠后时方案5表现最好。综合考虑,如果用户通常只查看少量页,方案5(使用ROW_NUMBER()函数)是最佳选择,但需注意SQL2000不支持此函数。此外,还提供了一个根据第四种方案编写的分页存储过程,方便在实际项目中应用。

各位是怎么做分页功能的啊

一般用分页,就会用到DataSet的对象,那么 DataSet ds = new DataSet();(Sql/OleDb)DataAdapter dtadp = new (Sql/OleDb)DataAdapter();dtadp.Fill(ds);此时可以使用 int RecordNum = ds.Tables["虚表名"].Rows.Count;获得总的记录数.这时,用判断得到总的页数.比如,设置每页最大记录数.private...

存储过程分页 存储过程实现分页 分页存储管理要求 请求分页存储管理题目 SQLserver存储过程 sqlserver存储过程参数 sql带参数存储过程 页号和页内偏移量怎么求 SQL通用分页
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见老婆光脚踩谷子 王者荣耀国服中,不论进入游戏还是没开始游戏,所有玩家发送的任何消息... 我的滴滴开空调活动怎么没了 为什么腾讯视频显示还是要流量看 没有联通中国结标志 电脑不能装win7买电脑时他们说只能装win10系统不能装win7 英雄联盟手游 手机lol游戏盒子现在叫什么? 英雄联盟手机盒子看不了比赛记录 手游英雄联盟视频在哪里看手机英雄联盟盒子在哪看我游戏中录的视频 英雄联盟盒子看视频只有声音没有画面,不是网速的问题,也不是电脑卡,是... 为什么英雄联盟盒子没发看视频 高分求SQL分页的存储过程 如何写分页存储过程 中国航空是哪所大学? 中国航空航天大学在哪 中国民航大学在哪里 中国民用航空学院飞行学院在哪里 空军航空大学在哪里? 中国民航大学的学校地址在哪里? 中国航空大学在哪里?具体在哪条路? 如何创建养鱼场 为什么近些年农村挖鱼塘养鱼的多了? 一亩鱼塘养多少鱼 一亩水塘最大养鱼密度 鱼塘养鱼平时需要干什么活? 手机怎样压缩视频 淡水鱼塘养鱼需注意什么? 网箱养鱼使用生石灰消毒的正确方法 手机怎么压缩视频 请问;网箱养鱼一平方可以放多少草鱼苗 梦见好多蛇被别人打的不死不活 一个通用的分页存储过程问题 sql server 存储过程分页 分页存储过程C# 代码 存储过程分页查询 使用存储过程查询并按每页10条记录分页显示图书借阅纪录 一个ASP使用存储过程分页显示的问题 oracle中建分页查询的存储过程 oracle存储过程的分页 SQL2000分页存储过程 求分页存储过程(SQL Server) java或存储过程分页问题 为什么要用分页存储过程 荣耀7x emui 9.1.0,如何隐藏应用? SQL分页与存储过程分页是一样的吗 华为EmUi5.1.3怎么隐藏应用? 求Sql Server2005分页存储过程 SQL分页存储 EMUI9如何隐藏应用? 分页存储管理的基本思想? 华为荣耀EMUI10.0.0怎样隐藏游戏应用?