SQL存储过程分页排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
create procedure [dbo].[CommonDataPager]
(
    --用途:分页查询记录信息
    --以下是几个参数的说明:
    --1.@tbName:表示表名
    --2.@PrimaryKey:表的主键
    --3.@searchCount:返回的结果数
    --4.@fldNames:字段名,多个字段以逗号分割
    --5.@PageSize:每页显示的记录数,如果为0,则表示不要分页,直接得到搜索、排序后的所有记录
    --6.@PageIndex:当前页的索引
    --7.@Filter:搜索条件,即在“where”后面写条件
    --8.@Sort:排序项,即在“order by”后面写排序项
    --9.@joinTable:连接其他表
    @tbName varchar(3000),
    @PrimaryKey varchar (255),
    @searchCount int output,
    @fldNames varchar(3000)='*',
    @PageSize int= 0,
    @PageIndex int= 1,
    @Filter nvarChar (3000)='',
    @Sort varchar (3000)='',
    @joinTable nvarchar(3000)=''            --调用的时候,可以类似如:as a inner join departInfo as b on a.departInfoId=b.Id
)
as
declare @start   nvarchar (100)
declare @end   nvarchar (100)
declare @m_WhereString varchar(4000)
declare @sqlString nvarchar(4000)           --动态拼接的SQL语句
declare @orderString   nvarchar (4000)
  
if(@PageSize < 0)
begin
    set @PageSize=0;
end
if(@PageIndex < 1)
begin
    set @PageIndex=1;
end
set @start = ltrim(rtrim(Cast((@PageSize*(@PageIndex - 1)+1) as varchar (100))))        --开始记录
set @end =ltrim(rtrim(Cast((@PageSize * @PageIndex) as varchar (100))))             --结束记录
set @m_WhereString=''
if(len(ltrim(rtrim(@Filter))) > 0)
begin
    set @m_WhereString   = ' where ' + @Filter;
end
  
if (len (ltrim (rtrim (@Sort))) > 0)
begin
    set @orderString   = ' order by ' + @Sort;
end
else
begin
    set @orderString   = ' order by ' + @PrimaryKey + ' asc '
end
declare @sqlStringOutput nvarchar(3000)
set @sqlStringOutput=N'select @searchCount=count(*) from ' + @tbName + ' ' + @joinTable + ' ' + @m_WhereString;
exec sp_executesql @sqlStringOutput,N'@searchCount int output',@searchCount output
if (@PageSize = 0)
begin
    --得到所有的搜索记录,并且不分页
    set @sqlString='select ' + @fldNames + ' from  ' + @tbName + @m_WhereString + ' ' + @orderString;
end
else
begin
    --实现分页效果,并且根据搜索条件过滤、分页、排序
    set @sqlString='select * from (select row_number() over('+ @orderString +') as myNewId,' + @fldNames + ' from ' + @tbName + ' ' + @joinTable + ' ' + @m_WhereString + ' ) as MyTempTable where myNewId between '+ @start +' and '+ @end +' order by myNewId asc' ;                                                             
end
exec(@sqlString)
go
  
  
/*
--测试调用存储过程
declare @count int
set @count=0
exec [CommonDataPager] 'UserInfo','Id',@count output,'userName,userAge',15,1,'userName like ''[^n]%'' ','userName desc',''
print @count
*/

  

代码如下:

 

  1.  
    create procedure [dbo].[CommonDataPager]
  2.  
    (
  3.  
    --用途:分页查询记录信息
  4.  
    --以下是几个参数的说明:
  5.  
    --1.@tbName:表示表名
  6.  
    --2.@PrimaryKey:表的主键
  7.  
    --3.@searchCount:返回的结果数
  8.  
    --4.@fldNames:字段名,多个字段以逗号分割
  9.  
    --5.@PageSize:每页显示的记录数,如果为0,则表示不要分页,直接得到搜索、排序后的所有记录
  10.  
    --6.@PageIndex:当前页的索引
  11.  
    --7.@Filter:搜索条件,即在“where”后面写条件
  12.  
    --8.@Sort:排序项,即在“order by”后面写排序项
  13.  
    --9.@joinTable:连接其他表
  14.  
    @tbName varchar(3000),
  15.  
    @PrimaryKey varchar (255),
  16.  
    @searchCount int output,
  17.  
    @fldNames varchar(3000)='*',
  18.  
    @PageSize int= 0,
  19.  
    @PageIndex int= 1,
  20.  
    @Filter nvarChar (3000)='',
  21.  
    @Sort varchar (3000)='',
  22.  
    @joinTable nvarchar(3000)='' --调用的时候,可以类似如:as a inner join departInfo as b on a.departInfoId=b.Id
  23.  
    )
  24.  
    as
  25.  
    declare @start nvarchar (100)
  26.  
    declare @end nvarchar (100)
  27.  
    declare @m_WhereString varchar(4000)
  28.  
    declare @sqlString nvarchar(4000) --动态拼接的SQL语句
  29.  
    declare @orderString nvarchar (4000)
  30.  
     
  31.  
    if(@PageSize < 0)
  32.  
    begin
  33.  
    set @PageSize=0;
  34.  
    end
  35.  
    if(@PageIndex < 1)
  36.  
    begin
  37.  
    set @PageIndex=1;
  38.  
    end
  39.  
    set @start = ltrim(rtrim(Cast((@PageSize*(@PageIndex - 1)+1) as varchar (100)))) --开始记录
  40.  
    set @end =ltrim(rtrim(Cast((@PageSize * @PageIndex) as varchar (100)))) --结束记录
  41.  
    set @m_WhereString=''
  42.  
    if(len(ltrim(rtrim(@Filter))) > 0)
  43.  
    begin
  44.  
    set @m_WhereString = ' where ' + @Filter;
  45.  
    end
  46.  
     
  47.  
    if (len (ltrim (rtrim (@Sort))) > 0)
  48.  
    begin
  49.  
    set @orderString = ' order by ' + @Sort;
  50.  
    end
  51.  
    else
  52.  
    begin
  53.  
    set @orderString = ' order by ' + @PrimaryKey + ' asc '
  54.  
    end
  55.  
    declare @sqlStringOutput nvarchar(3000)
  56.  
    set @sqlStringOutput=N'select @searchCount=count(*) from ' + @tbName + ' ' + @joinTable + ' ' + @m_WhereString;
  57.  
    exec sp_executesql @sqlStringOutput,N'@searchCount int output',@searchCount output
  58.  
    if (@PageSize = 0)
  59.  
    begin
  60.  
    --得到所有的搜索记录,并且不分页
  61.  
    set @sqlString='select ' + @fldNames + ' from ' + @tbName + @m_WhereString + ' ' + @orderString;
  62.  
    end
  63.  
    else
  64.  
    begin
  65.  
    --实现分页效果,并且根据搜索条件过滤、分页、排序
  66.  
    set @sqlString='select * from (select row_number() over('+ @orderString +') as myNewId,' + @fldNames + ' from ' + @tbName + ' ' + @joinTable + ' ' + @m_WhereString + ' ) as MyTempTable where myNewId between '+ @start +' and '+ @end +' order by myNewId asc' ;
  67.  
    end
  68.  
    exec(@sqlString)
  69.  
    go
  70.  
     
  71.  
     
  72.  
     

 

新:

 

  1.  
    create procedure [dbo].[CommonDataPager]
  2.  
    (
  3.  
    --用途:分页查询记录信息
  4.  
    --以下是几个参数的说明:
  5.  
    --1.@tbName:表示表名
  6.  
    --2.@PrimaryKey:表的主键
  7.  
    --3.@searchCount:返回的结果数
  8.  
    --4.@fldNames:字段名,多个字段以逗号分割
  9.  
    --5.@PageSize:每页显示的记录数,如果为0,则表示不要分页,直接得到搜索、排序后的所有记录
  10.  
    --6.@PageIndex:当前页的索引
  11.  
    --7.@Filter:搜索条件,即在“where”后面写条件
  12.  
    --8.@Sort:排序项,即在“order by”后面写排序项
  13.  
    --9.@joinTable:连接其他表
  14.  
    @tbName varchar(3000),
  15.  
    @PrimaryKey varchar (255),
  16.  
    @searchCount int output,
  17.  
    @fldNames varchar(3000)='*',
  18.  
    @PageSize int= 0,
  19.  
    @PageIndex int= 1,
  20.  
    @Filter nvarChar (3000)='',
  21.  
    @Sort varchar (3000)='',
  22.  
    @joinTable nvarchar(3000)='' --调用的时候,可以类似如:as a inner join departInfo as b on a.departInfoId=b.Id
  23.  
    )
  24.  
    as
  25.  
    declare @start nvarchar (100)
  26.  
    declare @end nvarchar (100)
  27.  
    declare @m_WhereString varchar(4000)
  28.  
    declare @sqlString nvarchar(4000) --动态拼接的SQL语句
  29.  
    declare @orderString nvarchar (4000)
  30.  
     
  31.  
    if(@PageSize < 0)
  32.  
    begin
  33.  
    set @PageSize=0;
  34.  
    end
  35.  
    if(@PageIndex < 1)
  36.  
    begin
  37.  
    set @PageIndex=1;
  38.  
    end
  39.  
    set @start = ltrim(rtrim(Cast((@PageSize*(@PageIndex - 1)+1) as varchar (100)))) --开始记录
  40.  
    set @end =ltrim(rtrim(Cast((@PageSize * @PageIndex) as varchar (100)))) --结束记录
  41.  
    set @m_WhereString=''
  42.  
    if(len(ltrim(rtrim(@Filter))) > 0)
  43.  
    begin
  44.  
    set @m_WhereString = ' where ' + @Filter;
  45.  
    end
  46.  
     
  47.  
    if (len (ltrim (rtrim (@Sort))) > 0)
  48.  
    begin
  49.  
    set @orderString = ' order by ' + @Sort;
  50.  
    end
  51.  
    else
  52.  
    begin
  53.  
    set @orderString = ' order by ' + @PrimaryKey + ' asc '
  54.  
    end
  55.  
    declare @sqlStringOutput nvarchar(3000)
  56.  
    set @sqlStringOutput=N'select @searchCount=count(*) from ' + @tbName + ' ' + @joinTable + ' ' + @m_WhereString;
  57.  
    exec sp_executesql @sqlStringOutput,N'@searchCount int output',@searchCount output
  58.  
    if (@PageSize = 0)
  59.  
    begin
  60.  
    --得到所有的搜索记录,并且不分页
  61.  
    set @sqlString='select ' + @fldNames + ' from ' + @tbName + @m_WhereString + ' ' + @orderString;
  62.  
    end
  63.  
    else
  64.  
    begin
  65.  
    --实现分页效果,并且根据搜索条件过滤、分页、排序
  66.  
    set @sqlString='select * from (select row_number() over('+ @orderString +') as myNewId,' + @fldNames + ' from ' + @tbName + ' ' + @joinTable + ' ' + @m_WhereString + ' ) as MyTempTable where myNewId between '+ @start +' and '+ @end +' order by myNewId asc' ;
  67.  
    end
  68.  
    exec(@sqlString)
  69.  
    go
  70.  
     
  71.  
     
  72.  
    /*
  73.  
    --测试调用存储过程
  74.  
    declare @count int
  75.  
    set @count=0
  76.  
    exec [CommonDataPager] 'UserInfo','Id',@count output,'userName,userAge',15,1,'userName like ''[^n]%'' ','userName desc',''
  77.  
    print @count
  78.  
    */

 

等待更新...

转载于:https://www.cnblogs.com/Music/archive/2010/08/14/SPCommonDataPager.html

 
posted @   vba是最好的语言  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示