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

sql多表关联,数据量比较大的分页查询,怎么做,有没有较好的方法,

发布网友 发布时间:2022-04-07 18:34

我来回答

3个回答

懂视网 时间:2022-04-07 22:55

数据库分页存储过程,支持多表联合查询


CREATE PROCEDURE [dbo].[getInQuiryAllByPage]
@tableNames varchar(5000), --表名,可多表,逗号分隔 
@tbFields varchar(5000)= '* ',--字段名,如果多表请带前缀 
@conditionStr varchar(5000)= ' ', --where子句,可为空,不带where 
@sortedStr varchar(5000), --排序字段,可多个,要带desc或asc,不带order by,必须,不能为空 
--排序字段不能有空值,或者在where中排除空值或者用isnull函数解决 

@needCount bit = 1, --是否需要得到纪录总数 
@pageIndex int =0, --页索引 
@pageSize int=10, --页大小 
@recordCount int =0 output, --返回纪录总数 
@pageCount int =0 output --返回页总数 

AS
BEGIN
declare @sql nvarchar(4000) --主sql语句 
declare @sortStr2 varchar(8000) --order by子句 
declare @sortStr3 varchar(8000) --order by子句 
declare @whereStr nvarchar(4000) --条件
declare @sortStr nvarchar(4000) --条件
set @sortStr = LOWER(@sortedStr) 
set @sortStr2 = REPLACE(@sortStr, 'desc', ' @a@ ') 
set @sortStr2 = REPLACE(@sortStr2, 'asc', ' @d@ ') 
set @sortStr2 = REPLACE(@sortStr2, ' @a@ ', ' asc ') 
set @sortStr2 = REPLACE(@sortStr2, ' @d@ ', ' desc ') 
--------------------------------------------------------------
set @sortStr2 = REPLACE(@sortStr2,'a.',' ')
set @sortStr2 = REPLACE(@sortStr2,'b.',' ')
set @sortStr2 = REPLACE(@sortStr2,'c.',' ')
set @sortStr2 = REPLACE(@sortStr2,'e.',' ')
set @sortStr2 = REPLACE(@sortStr2,'f.',' ')
set @sortStr2 = REPLACE(@sortStr2,'g.',' ')
set @sortStr3 = @sortStr
set @sortStr3 = REPLACE(@sortStr3,'a.',' ')
set @sortStr3 = REPLACE(@sortStr3,'b.',' ')
set @sortStr3 = REPLACE(@sortStr3,'c.',' ')
set @sortStr3 = REPLACE(@sortStr3,'e.',' ')
set @sortStr3 = REPLACE(@sortStr3,'f.',' ')
set @sortStr3 = REPLACE(@sortStr3,'g.',' ')
--------------------------------------------------------------
set @sortStr = ' order by ' + @sortStr 
set @sortStr2 = ' order by ' + @sortStr2 
set @sortStr3 = ' order by ' + @sortStr3 

if(@conditionStr is not null and @conditionStr != ' ' ) 
set @whereStr = ' where ' + @conditionStr 
else 
set @whereStr = ' ' 


--if(@needCound != 0 or @pageIndex = 0 ) --以下获得纪录总数 
begin 
DECLARE @R int 
SET @sql= 'select @R=count(*) from '+@tableNames + @whereStr
EXEC SP_EXECUTESQL @SQL,N'@R int OUTPUT ',@R OUTPUT 
SET @recordCount = @R 
set @pageCount = ((@recordCount-1)/@pageSize)+1 
end 

if(@pageIndex <2) --如果是第一页 
begin 
set @pageIndex = 1 
set @sql= 'select top '+ str(@pageSize) 
 + ' '+ @tbFields + ' from ' + @tableNames 
 + @whereStr + @sortStr; 
end 

else --其它页 
begin 
 if( @recordCount>@pageIndex*@pageSize)
	 
	SET @sql= 'SELECT * FROM ( ' 
	+ 'SELECT TOP ' + STR(@pageSize) + ' * FROM ( ' 
	+ 'select top ' + STR(@pageSize*@pageIndex) + ' '+ @tbFields + ' FROM ' 
	+ @tableNames + @whereStr + @sortStr + ') as a ' 
	+ @sortStr2 + ') as b ' + @sortStr3 
 
 else
 	
		SET @sql= ' select * FROM (' 
 + ' SELECT top '+ STR(@recordCount-@pageSize*(@pageCount-1)) 
		+ ' '+ @tbFields + ' FROM ' 
		+ @tableNames + @whereStr + @sortStr2 + ' ) AS a'
 + @sortStr3 
  
end 
print @sql
EXEC SP_EXECUTESQL @sql
END

数据库分页存储过程,支持多表联合查询

标签:数据库   分页   存储   sql   

热心网友 时间:2022-04-07 20:03

可以做一个存储过程,传入参数的方式,参数可以有显示第几页,分页大小,可以返回总行数和查询结果追问因为每个表都有上万条数据。这样查出来也很慢

追答你可以先count(*) 取得一下

热心网友 时间:2022-04-07 21:21

拿空间换时间,先查出来放到临时表里,然后从临时表里分页查追问查出来过程就很费时间了,。。我也试了放在临时表中,快了几秒

追答对啊,所以查一次比查多次好点吧。。。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见老婆光脚踩谷子 王者荣耀国服中,不论进入游戏还是没开始游戏,所有玩家发送的任何消息... 我的滴滴开空调活动怎么没了 为什么腾讯视频显示还是要流量看 没有联通中国结标志 电脑不能装win7买电脑时他们说只能装win10系统不能装win7 英雄联盟手游 手机lol游戏盒子现在叫什么? 英雄联盟手机盒子看不了比赛记录 手游英雄联盟视频在哪里看手机英雄联盟盒子在哪看我游戏中录的视频 英雄联盟盒子看视频只有声音没有画面,不是网速的问题,也不是电脑卡,是... 为什么英雄联盟盒子没发看视频 欢乐颂和我的前半生在上海哪个地区拍的? 欢乐颂2导演和欢乐颂1的导演 含糖分少的食物 含糖类低的食物有哪些 什么食物含糖少? 含糖低的食物有哪些 什么食物含糖量低 k7705火车4车厢1A2A挨着吗? 什么食物糖分低 请问从广西北海到江门台山市应该怎么坐车比较方便?最好是早上到的。 衡水到承德护理学院人怎么走 珠海站11点多有高铁进站吗? 为什么人死后瞳孔会散大?拜托各位了 3Q k7705次列车去北京在哪个站坐车? 人死亡后瞳孔为什么会放大,身体要多久才会变硬。 中山站到珠海拱北轻轨具体的时刻表? 刷快手复活卡犯法吗? 人死了,为什么瞳孔会放大? 贪吃蛇复活卡怎么购买? 大连到庄河高铁多少钱 琅琊榜和欢乐颂哪个先拍的 欢乐颂什么时候播出,什么时候上映,播出时间,那个台 欢乐颂是贝多芬哪年作的? 贝多芬的《欢乐颂》的由来 欢乐颂那个小区上海什么地方取景? 欢乐颂的来源? 重庆公务员一般多少分 电视剧是不是才拍了欢乐颂的第一部 贝多芬的欢乐颂是几几拍? 重庆公务员面试分一分顶笔试多少 电视剧欢乐颂在松江拍的吗? 请问这种植物的学名叫什么,它是一种一年生草本植物,有木姜子油的气味,我们这里常用做煮鱼的调料。 木姜油怎么用? 韩电bcd-406cp4e冰箱怎么调节 2017年~2019年重庆各区县公务员考试平均竞争比及最低进面分分析! 木姜子油的做法步骤图,木姜子油怎么做好吃 韩电冰箱bcd一230ch3变温室温度怎样调节 木姜子黑了怎么办?还能吃吗? 什么是奋斗、拼搏? 韩电冰箱bcd-498cp2e怎么样调温度