问答文章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
生产车间员工岗位职责及权限、任职要求分别是什么 车间普工岗位职责(集合6篇) "上海"的地名是谁起的,什么意思? 老公的爸妈是表亲,我爸妈也是表兄妹,孩子会怎么样吗? 爸妈是近亲结婚他们是表兄妹 我生孩子会有问题吗? 爸妈是亲表兄妹结婚对这代没事。。不知道下一代有问题没。。。_百度... 鉴证实录 法证女朋友怎么死的0 沈阳御通实业有限公司怎么样? 玉环御通广告有限公司御通服务 问御石通效果怎么样啊,治疗结石的 欢乐颂和我的前半生在上海哪个地区拍的? 欢乐颂2导演和欢乐颂1的导演 含糖分少的食物 含糖类低的食物有哪些 什么食物含糖少? 含糖低的食物有哪些 什么食物含糖量低 k7705火车4车厢1A2A挨着吗? 什么食物糖分低 请问从广西北海到江门台山市应该怎么坐车比较方便?最好是早上到的。 衡水到承德护理学院人怎么走 珠海站11点多有高铁进站吗? 为什么人死后瞳孔会散大?拜托各位了 3Q k7705次列车去北京在哪个站坐车? 人死亡后瞳孔为什么会放大,身体要多久才会变硬。 中山站到珠海拱北轻轨具体的时刻表? 刷快手复活卡犯法吗? 人死了,为什么瞳孔会放大? 贪吃蛇复活卡怎么购买? 大连到庄河高铁多少钱 琅琊榜和欢乐颂哪个先拍的 欢乐颂什么时候播出,什么时候上映,播出时间,那个台 欢乐颂是贝多芬哪年作的? 贝多芬的《欢乐颂》的由来 欢乐颂那个小区上海什么地方取景? 欢乐颂的来源? 重庆公务员一般多少分 电视剧是不是才拍了欢乐颂的第一部 贝多芬的欢乐颂是几几拍? 重庆公务员面试分一分顶笔试多少 电视剧欢乐颂在松江拍的吗? 请问这种植物的学名叫什么,它是一种一年生草本植物,有木姜子油的气味,我们这里常用做煮鱼的调料。 木姜油怎么用? 韩电bcd-406cp4e冰箱怎么调节 2017年~2019年重庆各区县公务员考试平均竞争比及最低进面分分析! 木姜子油的做法步骤图,木姜子油怎么做好吃 韩电冰箱bcd一230ch3变温室温度怎样调节 木姜子黑了怎么办?还能吃吗? 什么是奋斗、拼搏? 韩电冰箱bcd-498cp2e怎么样调温度