分页存储过程--同时返回数据总数

Posted JustYong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分页存储过程--同时返回数据总数相关的知识,希望对你有一定的参考价值。

1、定义存储过程

 1 USE [IPP_PCL]
 2 GO
 3 /****** Object:  StoredProcedure [dbo].[Printed_GetEOrderPrintedStatus]    Script Date: 11/04/2016 17:29:40 ******/
 4 SET ANSI_NULLS ON
 5 GO
 6 SET QUOTED_IDENTIFIER ON
 7 GO
 8 
 9 ALTER proc [dbo].[Printed_GetEOrderPrintedStatus]
10 @intPageIndex int,--当前页索引
11 @intPageSize int,--每页显示的记录数
12 @strEOrderNo nvarchar(50),
13 @strLoginId nvarchar(50),
14 @strCustomerItemCode nvarchar(30),
15 @strProductCode nvarchar(30),
16 @strCostomerPO nvarchar(30),
17 @dateOrderDateCreateFrom datetime,
18 @dateOrderDateCreateTo datetime,
19 @strMainProgram nvarchar(50),
20 @strSubProgram nvarchar(50),
21 
22 @intReslut int OUTPUT,
23 @intTotal int OUTPUT --总记录数
24 as
25 BEGIN
26     DECLARE @strWhere NVARCHAR(1000) = ‘‘
27     DECLARE @strOrderBy NVARCHAR(50) = ORDER BY OrderCreatedDate desc
28   
29     --根据参数生成where条件
30     IF ISNULL(@strEOrderNo, ‘‘) <> ‘‘ 
31     SET @strWhere = @strWhere +  AND EOrderNo like ‘‘% + @strEOrderNo + %‘‘‘ 
32     
33     IF ISNULL(@strLoginId, ‘‘) <> ‘‘ 
34     SET @strWhere = @strWhere +  AND LoginId like ‘‘% + @strLoginId + %‘‘‘ 
35     
36     IF ISNULL(@strCustomerItemCode, ‘‘) <> ‘‘ 
37     SET @strWhere = @strWhere +  AND CustomerItemCode like ‘‘% + @strCustomerItemCode + %‘‘‘ 
38     
39     IF ISNULL(@strProductCode, ‘‘) <> ‘‘ 
40     SET @strWhere = @strWhere +  AND ProductCode like ‘‘% + @strProductCode + %‘‘‘ 
41     
42     IF ISNULL(@strCostomerPO, ‘‘) <> ‘‘ 
43     SET @strWhere = @strWhere +  AND CustomerPo like ‘‘% + @strCostomerPO + %‘‘‘ 
44     
45     IF @dateOrderDateCreateFrom IS NOT NULL
46     SET @strWhere = @strWhere +  AND OrderCreatedDate >= ‘‘‘ + CONVERT(VARCHAR(100),@dateOrderDateCreateFrom,121) + ‘‘‘‘
47    
48     IF @dateOrderDateCreateTo IS NOT NULL
49     SET @strWhere = @strWhere +  AND OrderCreatedDate < ‘‘‘ + CONVERT(VARCHAR(100),DATEADD(day,1,@dateOrderDateCreateTo),121) + ‘‘‘‘
50     
51     IF ISNULL(@strMainProgram, ‘‘) <> ‘‘ 
52     SET @strWhere = @strWhere +  AND MainProgram = ‘‘‘ + @strMainProgram + ‘‘‘‘
53     
54     IF ISNULL(@strSubProgram, ‘‘) <> ‘‘ 
55     SET @strWhere = @strWhere +  AND SubProgram =  ‘‘‘ + @strSubProgram + ‘‘‘‘
56 
57     --获取记录总数
58     DECLARE @strCountSql NVARCHAR(1000)
59     SET @strCountSql = Select @RecordCount = count(*) FROM Printed_EOrderPrintedStatus WHERE 1 = 1  + @strWhere
60     EXEC sp_executesql @strCountSql, N@RecordCount int OUTPUT, @intTotal OUTPUT
61    
62     
63     DECLARE @strSql NVARCHAR(1000)
64     SET @strSql = SELECT TOP  + CONVERT(VARCHAR(10),@intPageIndex * @intPageSize) +  ROW_NUMBER() OVER( + @strOrderBy + ) AS rownum, * FROM Printed_EOrderPrintedStatus WHERE 1 = 1 + @strWhere + @strOrderBy
65     SET @strSql = SELECT * FROM ( + @strSql + ) as temp WHERE temp.rownum >  + CONVERT(VARCHAR(10), (@intPageSize * (@intPageIndex - 1)))
66     EXEC(@strSql)
67     
68     if(@intTotal>0)
69     begin
70         set @intReslut=1
71     end
72     
73 end

2、书写时应注意的点

(1) 定义@strWhere变量后,应及时初始化。

(2) 拼接SQL条件时,应注意用‘‘包括字段值。

(3) 应把时间变量转换成特定格式的字符串

(4) EXEC()

(5) EXEC sp_executesql

 

3、调用存储过程

 1    DECLARE @intPageIndex INT = 36
 2    DECLARE @intPageSize INT = 10 -- int
 3    DECLARE @strEOrderNo NVARCHAR(50) = N‘‘ -- nvarchar(50)
 4    DECLARE @strLoginId NVARCHAR(50) = N‘‘ -- nvarchar(50)
 5    DECLARE @strCustomerItemCode nvarchar(30) = N‘‘ -- nvarchar(30)
 6    DECLARE @strProductCode nvarchar(30) = N10 -- nvarchar(30)
 7    DECLARE @strCostomerPO nvarchar(30) = N‘‘ -- nvarchar(30)
 8    DECLARE @dateOrderDateCreateFrom DATETIME = 2016-1-18 03:59:00 -- datetime
 9    DECLARE @dateOrderDateCreateTo DATETIME = 2016-10-18 03:59:00 -- datetime
10    DECLARE @strMainProgram nvarchar(50) = N88 -- nvarchar(50)
11    DECLARE @strSubProgram nvarchar(50) = N‘‘ -- nvarchar(50)
12    DECLARE @intReslut INT = 0 -- int
13    DECLARE @intTotal INT = 0 -- int
14 
15 EXEC dbo.Printed_GetEOrderPrintedStatus @intPageIndex, 
16     @intPageSize, 
17     @strEOrderNo, 
18     @strLoginId, 
19     @strCustomerItemCode, 
20     @strProductCode, 
21     @strCostomerPO,
22     @dateOrderDateCreateFrom, -- datetime
23     @dateOrderDateCreateTo, -- datetime
24     @strMainProgram, -- nvarchar(50)
25     @strSubProgram, -- nvarchar(50)
26     @intReslut OUTPUT, -- int
27     @intTotal OUTPUT -- int
28 
29 SELECT @intTotal
30 SELECT @intReslut

 

以上是关于分页存储过程--同时返回数据总数的主要内容,如果未能解决你的问题,请参考以下文章

一条sql语句实现分页查询,且能返回记录总数

数据分页存储过程

基于Dapper的分页实现,支持筛选,排序,结果集总数,非存储过程

一种效率比较高的分页存储过程

sqlserver分页存储过程

求一个通用ORACLE存储过程,实现分页和查询?