求个高效分页存储过程
发布网友
发布时间: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 < t1.id) >= 11 AND (SELECT count(*) FROM databasetest t2 WHERE t2.id < t1.id) < 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<=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...