微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SqlServer存储过程分页查询

ALTER PROCEDURE [dbo].[P_Common_Pagination]
(
 @currentPage int,--当前页码
 @pageSize int,--每页记录数
 @querysql nvarchar(max),--查询sql
 @ordersql nvarchar(max),--排序sql
 @totalsql nvarchar(max),--查询总记录数sql
 @totalCount int output,--总记录数
 @newCurrentPage int output,--返回的当前页码
 @exceptionMsg nvarchar(4000) output --异常信息,无异常返回的是NULL,有异常返回具体的异常信息
)
AS
declare @StartIndex int
declare @Endindex int
declare @maxPage int
BEGIN


BEGIN TRY -- 异常捕获


set @totalsql = N'select @totalCount=' + @totalsql;
  --执行
  EXEC SP_EXECUTEsql @totalsql,N'@totalCount int OUTPUT',@totalCount OUTPUT
  
  
  --判断当前页是否超出总页
  IF 0 != @totalCount
   BEGIN
SET @maxPage = (@totalCount / @pageSize);
IF 0 != (@totalCount % @pageSize)
SET @maxPage = @maxPage + 1
   IF @currentPage > @maxPage
    SET @currentPage = @maxPage
 END
ELSE
SET @currentPage = 1
  
  SET @newCurrentPage = @currentPage

set @StartIndex = (@currentPage - 1)*@pageSize + 1;
set @Endindex = @currentPage*@pageSize;
set @querysql = N'SELECT *
from (
select ROW_NUMBER() over (' + @ordersql + ') as rownum,'
+ @querysql
+ ') tt where rownum between ' + cast(@StartIndex as varchar(50))
+ ' and ' + cast(@Endindex as varchar(50));


EXEC (@querysql)



END TRY
BEGIN CATCH --异常发生后,相应的事务等处理


--异常信息
set @exceptionMsg = '消息 ' + cast(ERROR_NUMBER() as varchar(50)) + ',级别 '
+ cast(ERROR_SEVERITY() as varchar(50)) + ',状态 '
+ cast(ERROR_STATE() as varchar(50)) + ',过程 ' + 'P_Common_Pagination'
+ ',第 ' + cast(ERROR_LINE() as varchar(50)) + ' 行'
+ ':' + ERROR_MESSAGE();

INSERT INTO Logger(logType,@R_845_4045@ion)
VALUES('ERROR',@exceptionMsg);

END CATCH    


END

分页查询实例
ALTER PROCEDURE [dbo].[P_ExceptionWaybillPagelist]
(
@currentPage int,--当前页码
@pageSize int,--每页记录数
@conditionXml nvarchar(max),--条件参数XML字符串
@totalCount int output,--总记录数
@newCurrentPage int output,--返回的当前页码
@exceptionMsg nvarchar(4000) output --异常信息,无异常返回的是NULL,有异常返回具体的异常信息
)
AS
DECLARE @beforesql nvarchar(max) --查询sql的头部
DECLARE @midsql nvarchar(max) --中间公用的sql
DECLARE @querysql nvarchar(max) --查询sql(去掉头部的select和尾部的排序sql)
DECLARE @ordersql nvarchar(max) --尾部的排序sql
DECLARE @totalsql nvarchar(max) --查询总记录数sql(去掉头部的select)
DECLARE @xml xml --查询条件的XML

DECLARE @outSidnvarchar(100)
DECLARE @beginTime nvarchar(100) 
DECLARE @endTime nvarchar(100) 

BEGIN


BEGIN TRY -- 异常捕获


--必须放在最前面,紧接着事务点
set @xml = SUBSTRING(@conditionXml,39,LEN(@conditionXml)-38);
 
select @outSid = c.doc.value('outSid[1]','varchar(100)'),@beginTime = c.doc.value('beginTime[1]',@endTime = c.doc.value('endTime[1]','varchar(100)')
from @xml.nodes('/nodes/node') c(doc);   


SET @beforesql = 'wb.OUT_SID,wb.COMPANY_NAME,wb.DELIVER_TIME'
 
 
SET @midsql = ' FROM WAYBILL wb WHERE 1 = 1'
 

--************************************ 查询条件处理start ************************************--
IF ISNULL(@outSid,'') <> ''
SET @midsql = @midsql + ' and wb.OUT_SID =  ''' + @outSid + '''';

IF ISNULL(@beginTime,'') <> ''
SET @midsql = @midsql + ' and wb.DELIVER_TIME  >= ''' + CONVERT(VARCHAR,CAST(@beginTime AS DATETIME),(23)) + '''';


IF ISNULL(@endTime,'') <> ''
SET @midsql = @midsql + ' and wb.DELIVER_TIME  < ''' + CONVERT(VARCHAR,CAST(@endTime AS DATETIME) + 1,(23)) + '''';

--************************************ 查询条件处理end ************************************--


SET @ordersql = ' ORDER BY wb.DELIVER_TIME'
SET @querysql = @beforesql + @midsql
SET @totalsql = 'count(*)' + @midsql

EXEC P_Common_Pagination @currentPage,@pageSize,@querysql,@ordersql,@totalsql,@totalCount output,@newCurrentPage output,@exceptionMsg output;




END TRY
BEGIN CATCH --异常发生后,相应的事务等处理


--异常信息
set @exceptionMsg = '消息 ' + cast(ERROR_NUMBER() as varchar(50)) + ',级别 '
+ cast(ERROR_SEVERITY() as varchar(50)) + ',状态 '
+ cast(ERROR_STATE() as varchar(50)) + ',过程 ' + 'P_ExceptionWaybillPagelist'
+ ',第 ' + cast(ERROR_LINE() as varchar(50)) + ' 行'
+ ':' + ERROR_MESSAGE();


--异常日志
INSERT INTO Logger(logType,@exceptionMsg);

END CATCH    


END

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐