不适用临时表进行分页,筛选,查询,避免高并发的方法。
来源:互联网 发布:c语言输入保留两位小数 编辑:程序博客网 时间:2024/06/05 05:49
ALTER proc [dbo].[GetD_OrderInfoCollectionForPaging](
@PageIndex int, ----当前的页码
@PageSize int, ----每页显示多少条
@RecordCount int output,----总条数
@PageCount int output , ----总页数
@TransactionType nvarchar(4000),-------交易类型编号
@BusinessStatus nvarchar(4000),----交易状态
@StrSeach nvarchar(4000),------搜索条件
----------排序标示: 0 无排序,1 升序 ,2 降序
@OrderNum char(1),--------按照数量排序的标示
@OrderMoney char(1),------按照金额排序的标示
@OrderCreate char(1),-----按照交易时间排序的标示
@OrderDiff char(1)----按照剩余时间排序的标示
)
as
begin
declare @JPWhere varchar(4000)----条件字符串
declare @JPBy varchar(4000) ----排序字符串(内层的)
declare @JPByOut varchar(4000)----排序字符串(外层的)
declare @val nvarchar(4000)----定义一个参数用来接收T-SQL语句
declare @sql nvarchar(4000)----定义一个参数用来接收T-SQL语句
-----初次或者没有条件筛选,加载所有信息
IF(@TransactionType='0' and @BusinessStatus='0' and (@StrSeach=''or @StrSeach is null ) and @OrderNum='0' and @OrderMoney='0' and @OrderCreate='0' and @OrderDiff='0')
begin
set @JPWhere='where 1=1 '
set @JPBy=' order by o.CreateTime desc '
set @JPByOut=' order by t.CreateTime desc '
end
-----有条件进行筛选
else
begin
set @JPWhere='Where 1=1 '
set @JPBy='order by o.CreateTime desc '
set @JPByOut=' order by t.CreateTime desc '
if(@TransactionType!='0')--按照类别查询
begin
set @JPWhere= @JPWhere+ ' and o.TransactionType ='+@TransactionType
end
if(@BusinessStatus!='0')--按照状态查询
begin
set @JPWhere=@JPWhere+' and o.BusinessStatus='+@BusinessStatus
end
if(@StrSeach!='')---模糊查询
begin
set @JPWhere=@JPWhere+' and o.OrderCode like '''+ @StrSeach+'%''' +' or p.ProjectName like'''+@StrSeach+'%'''
end
if(@OrderNum='1')---按照数量排序
begin
set @JPBy=' order by im.num asc '
set @JPByOut=' order by t.num asc '
end
if(@OrderNum='2')
begin
set @JPBy=' order by im.num desc '
set @JPByOut=' order by t.num desc '
end
if(@OrderMoney='1')---按照金额排序
begin
set @JPBy=' order by o.BusinessAmount asc '
set @JPByOut=' order by t.BusinessAmount asc '
end
if(@OrderMoney='2')
begin
set @JPBy=' order by o.BusinessAmount desc '
set @JPByOut=' order by t.BusinessAmount desc '
end
if(@OrderCreate='1')---按照时间排序
begin
set @JPBy=' order by o.CreateTime asc '
set @JPByOut=' order by t.CreateTime asc '
end
if(@OrderCreate='2')
begin
set @JPBy=' order by o.CreateTime desc '
set @JPByOut=' order by t.CreateTime desc '
end
if(@OrderDiff='1')---按照剩余时间排序
begin
set @JPBy=' order by DATEDIFF(HH,o.CreateTime,o.FinishDate) asc'
set @JPByOut=' order by t.Diff asc '
end
if(@OrderDiff='2')
begin
set @JPBy=' order by DATEDIFF(HH,o.CreateTime,o.FinishDate) desc'
set @JPByOut=' order by t.Diff desc '
end
end
set @val='select @count=count(1) from( select ROW_NUMBER() over(' +@JPBy+ ') rowNumber, o.OrderCode,p.ProjectName,o.TransactionType,im.num,c.CustomerName sellerName,e.CustomerName buyName,o.BusinessAmount,'
+' o.CreateTime,DATEDIFF(HH,o.CreateTime,o.FinishDate) Diff,o.BusinessStatus'
+' from D_OrderInfo o'
+' left join D_ProjectInfo p on p.ProjectID=o.ProjectID'
+' left join (select i.ProjectID,COUNT(*) num from D_ProjectImageInfo i where i.IsDeleted=0 or i.IsDeleted is null group by i.ProjectID) im on im.ProjectID=o.ProjectID'
+' left join E_CustomerInfo c on c.CustomerID=o.Seller'
+' left join E_CustomerInfo e on e.CustomerID=o.CreatorID '+@JPWhere+' ) t'
-----执行这条拼接的字符串
--exec(@val)
--print (@val)
----执行过以后,会创建出来一张全局表##temp(里面包含所有的条件过滤后的数据)
----查询出来总共的记录数
--select @RecordCount = COUNT(1) from ##tablejp
EXEC sp_executesql @val, N'@count int output',@RecordCount OUTPUT
----查询出来总共的页数
SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize)
----对查询的数据集进行分页
set @sql='select OrderCode,TransactionType,BusinessAmount,
CreateTime,BusinessStatus,Convert(nvarchar,isnull(num,0))+'';''+isnull(sellerName,'''')+'';''+isnull(buyName,'''')+'';''+Convert(nvarchar,isnull(Diff,0))+'';''+isnull(ProjectName,'''') Remark
from (select ROW_NUMBER() over(' +@JPBy+ ') rowNumber, o.OrderCode,p.ProjectName,o.TransactionType,im.num,c.CustomerName sellerName,e.CustomerName buyName,o.BusinessAmount,
o.CreateTime,DATEDIFF(HH,o.CreateTime,o.FinishDate) Diff,o.BusinessStatus
from D_OrderInfo o
left join D_ProjectInfo p on p.ProjectID=o.ProjectID
left join (select i.ProjectID,COUNT(*) num from D_ProjectImageInfo i where i.IsDeleted=0 or i.IsDeleted is null group by i.ProjectID) im on im.ProjectID=o.ProjectID
left join E_CustomerInfo c on c.CustomerID=o.Seller
left join E_CustomerInfo e on e.CustomerID=o.CreatorID '+@JPWhere+') t where rowNumber between ' + STR(@PageIndex * @PageSize + 1) + ' and ('
+ STR(@PageIndex + 1) + ') * ' + STR(@PageSize) + ' '+@JPByOut
print @sql
EXEC sp_executesql @sql
end
0 0
- 不适用临时表进行分页,筛选,查询,避免高并发的方法。
- 效率不高的分页方法
- 效率不高的分页方法
- 巧用SQL的with语法生成临时结果集,进行查询与更新同步操作,解决高并发下对数据的重复访问
- Solr中使用游标进行深度分页查询以提高效率(适用的场景下)
- 结合row_number函数和临时表进行分页的思路
- 用Jpa查询的数据,不能用PageHelper进行分页
- 使用临时表配合ObjectDataSource进行分页
- SQL分页查询,临时表办法
- 在SYBASE中进行分页查询的方法
- 临时表的分页SQL
- 什么是高并发?如何避免高并发?
- sql 查询,把查出的数据作为临时表在进行查询
- 高并发的处理方法
- 高并发的应对方法
- 创建索引,临时表,支持条件查询的分页 首页为1
- 利用临时表、REF游标、动态SQL实现分页查询
- 高并发架构以及处理高并发的常见方法
- c#得到本月有几周和这几周的起止时间
- centos使用ajp整合apache和tomcat
- Linux VIP(虚拟IP)配置后,无法ping通的问题处理
- webstorm注册序列号和那啥
- C++学习笔记10-面向对象
- 不适用临时表进行分页,筛选,查询,避免高并发的方法。
- .net 文件上传至数据库二进制字段 及读取操作。
- QSqlQuery::value: not positioned on a valid record
- 使用HTML5的十大原因
- css hack IE兼容调试小结(Webstorm、VS2010),有图有真相,研究了一中午
- 服务器如何生成ID
- YUV内存里的存放顺序
- 关于完成端口,部分内容摘要
- cocos2d-x 3.1.1 学习笔记[14] UserDefault 用户数据存储