zoukankan      html  css  js  c++  java
  • [转]Sql Server 分页存储过程

    本文转自:

    分页存储过程一:

    1. --/*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/   
    2. --/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/   
    3. --/*-----存储过程 分页处理 孙伟 2005-04-21修改 添加Distinct查询功能-------*/   
    4. --/*-----存储过程 分页处理 孙伟 2005-05-18修改 多字段排序规则问题-------*/   
    5. --/*-----存储过程 分页处理 孙伟 2005-06-15修改 多字段排序修改-------*/   
    6. --/*-----存储过程 分页处理 孙伟 2005-12-13修改 修改数据分页方式为top max模式性能有极大提高-------*/   
    7. --/*-----缺点:相对之前的not in版本主键只能是整型字段,如主键为GUID类型请使用not in 模式的版本-------*/   
    8. CREATE PROCEDURE dbo.proc_ListPageInt   
    9. (   
    10. @tblName nvarchar(200), ----要显示的表或多个表的连接   
    11. @fldName nvarchar(500) = '*', ----要显示的字段列表   
    12. @pageSize int = 10, ----每页显示的记录个数   
    13. @page int = 1, ----要显示那一页的记录   
    14. @pageCount int = 1 output, ----查询结果分页后的总页数   
    15. @Counts int = 1 output, ----查询到的记录数   
    16. @fldSort nvarchar(200) = null, ----排序字段列表或条件   
    17. @Sort bit = 0, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')   
    18. @strCondition nvarchar(1000) = null, ----查询条件,不需where   
    19. @ID nvarchar(150), ----主表的主键   
    20. @Dist bit = 0 ----是否添加查询字段的 DISTINCT 默认0不添加/1添加   
    21. )   
    22. AS   
    23. SET NOCOUNT ON   
    24. Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句   
    25. Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句   
    26. Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句   
    27.   
    28. Declare @strSortType nvarchar(10) ----数据排序规则A   
    29. Declare @strFSortType nvarchar(10) ----数据排序规则B   
    30.   
    31. Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造   
    32. Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造   
    33.   
    34.   
    35. if @Dist = 0   
    36. begin   
    37. set @SqlSelect = 'select '   
    38. set @SqlCounts = 'Count(*)'   
    39. end   
    40. else   
    41. begin   
    42. set @SqlSelect = 'select distinct '   
    43. set @SqlCounts = 'Count(DISTINCT '+@ID+')'   
    44. end   
    45.   
    46.   
    47. if @Sort=0   
    48. begin   
    49. set @strFSortType=' ASC '   
    50. set @strSortType=' DESC '   
    51. end   
    52. else   
    53. begin   
    54. set @strFSortType=' DESC '   
    55. set @strSortType=' ASC '   
    56. end   
    57.   
    58.   
    59.   
    60. --------生成查询语句--------   
    61. --此处@strTmp为取得查询结果数量的语句   
    62. if @strCondition is null or @strCondition='' --没有设置显示条件   
    63. begin   
    64. set @sqlTmp = @fldName + ' From ' + @tblName   
    65. set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName  
    66. set @strID = ' From ' + @tblName   
    67. end   
    68. else   
    69. begin   
    70. set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition   
    71. set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition   
    72. set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition   
    73. end   
    74.   
    75. ----取得查询结果总数量-----   
    76. exec sp_executesql @strTmp,N'@Counts int out ',@Counts out   
    77. declare @tmpCounts int   
    78. if @Counts = 0   
    79. set @tmpCounts = 1   
    80. else   
    81. set @tmpCounts = @Counts   
    82.   
    83. --取得分页总数   
    84. set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize   
    85.   
    86. /**//**当前页大于总页数 取最后一页**/   
    87. if @page>@pageCount   
    88. set @page=@pageCount   
    89.   
    90. --/*-----数据分页2分处理-------*/   
    91. declare @pageIndex int --总数/页大小   
    92. declare @lastcount int --总数%页大小   
    93.   
    94. set @pageIndex = @tmpCounts/@pageSize   
    95. set @lastcount = @tmpCounts%@pageSize   
    96. if @lastcount > 0   
    97. set @pageIndex = @pageIndex + 1   
    98. else   
    99. set @lastcount = @pagesize   
    100.   
    101. --//***显示分页   
    102. if @strCondition is null or @strCondition='' --没有设置显示条件   
    103. begin   
    104. if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理   
    105. begin   
    106. if @page=1   
    107. set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName  
    108. +' order by '+ @fldSort +' '+ @strFSortType   
    109. else   
    110. begin   
    111. set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName  
    112. +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName  
    113. +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)'   
    114. +' order by '+ @fldSort +' '+ @strFSortType   
    115. end   
    116. end   
    117. else   
    118. begin   
    119. set @page = @pageIndex-@page+1 --后半部分数据处理   
    120. if @page <= 1 --最后一页数据显示   
    121. set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName  
    122. +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType   
    123. else   
    124. set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName  
    125. +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName  
    126. +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)'   
    127. +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType   
    128. end   
    129. end   
    130.   
    131. else --有查询条件   
    132. begin   
    133. if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理   
    134. begin   
    135. if @page=1   
    136. set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName  
    137. +' where 1=1 ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType   
    138. else   
    139. begin   
    140. set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName  
    141. +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName  
    142. +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)'   
    143. +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType   
    144. end   
    145. end   
    146. else   
    147. begin   
    148. set @page = @pageIndex-@page+1 --后半部分数据处理   
    149. if @page <= 1 --最后一页数据显示   
    150. set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName  
    151. +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType   
    152. else   
    153. set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName  
    154. +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName  
    155. +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)'   
    156. +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType   
    157. end   
    158. end   
    159.   
    160. ------返回查询结果-----   
    161. exec sp_executesql @strTmp   
    162. --print @strTmp   
    163. SET NOCOUNT OFF   
    164. GO   
    --/*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/ 
    --/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/ 
    --/*-----存储过程 分页处理 孙伟 2005-04-21修改 添加Distinct查询功能-------*/ 
    --/*-----存储过程 分页处理 孙伟 2005-05-18修改 多字段排序规则问题-------*/ 
    --/*-----存储过程 分页处理 孙伟 2005-06-15修改 多字段排序修改-------*/ 
    --/*-----存储过程 分页处理 孙伟 2005-12-13修改 修改数据分页方式为top max模式性能有极大提高-------*/ 
    --/*-----缺点:相对之前的not in版本主键只能是整型字段,如主键为GUID类型请使用not in 模式的版本-------*/ 
    CREATE PROCEDURE dbo.proc_ListPageInt 
    ( 
    @tblName nvarchar(200), ----要显示的表或多个表的连接 
    @fldName nvarchar(500) = '*', ----要显示的字段列表 
    @pageSize int = 10, ----每页显示的记录个数 
    @page int = 1, ----要显示那一页的记录 
    @pageCount int = 1 output, ----查询结果分页后的总页数 
    @Counts int = 1 output, ----查询到的记录数 
    @fldSort nvarchar(200) = null, ----排序字段列表或条件 
    @Sort bit = 0, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ') 
    @strCondition nvarchar(1000) = null, ----查询条件,不需where 
    @ID nvarchar(150), ----主表的主键 
    @Dist bit = 0 ----是否添加查询字段的 DISTINCT 默认0不添加/1添加 
    ) 
    AS 
    SET NOCOUNT ON 
    Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句 
    Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句 
    Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句 
    
    Declare @strSortType nvarchar(10) ----数据排序规则A 
    Declare @strFSortType nvarchar(10) ----数据排序规则B 
    
    Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造 
    Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造 
    
    
    if @Dist = 0 
    begin 
    set @SqlSelect = 'select ' 
    set @SqlCounts = 'Count(*)' 
    end 
    else 
    begin 
    set @SqlSelect = 'select distinct ' 
    set @SqlCounts = 'Count(DISTINCT '+@ID+')' 
    end 
    
    
    if @Sort=0 
    begin 
    set @strFSortType=' ASC ' 
    set @strSortType=' DESC ' 
    end 
    else 
    begin 
    set @strFSortType=' DESC ' 
    set @strSortType=' ASC ' 
    end 
    
    
    
    --------生成查询语句-------- 
    --此处@strTmp为取得查询结果数量的语句 
    if @strCondition is null or @strCondition='' --没有设置显示条件 
    begin 
    set @sqlTmp = @fldName + ' From ' + @tblName 
    set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName
    set @strID = ' From ' + @tblName 
    end 
    else 
    begin 
    set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition 
    set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition 
    set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition 
    end 
    
    ----取得查询结果总数量----- 
    exec sp_executesql @strTmp,N'@Counts int out ',@Counts out 
    declare @tmpCounts int 
    if @Counts = 0 
    set @tmpCounts = 1 
    else 
    set @tmpCounts = @Counts 
    
    --取得分页总数 
    set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize 
    
    /**//**当前页大于总页数 取最后一页**/ 
    if @page>@pageCount 
    set @page=@pageCount 
    
    --/*-----数据分页2分处理-------*/ 
    declare @pageIndex int --总数/页大小 
    declare @lastcount int --总数%页大小 
    
    set @pageIndex = @tmpCounts/@pageSize 
    set @lastcount = @tmpCounts%@pageSize 
    if @lastcount > 0 
    set @pageIndex = @pageIndex + 1 
    else 
    set @lastcount = @pagesize 
    
    --//***显示分页 
    if @strCondition is null or @strCondition='' --没有设置显示条件 
    begin 
    if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理 
    begin 
    if @page=1 
    set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    +' order by '+ @fldSort +' '+ @strFSortType 
    else 
    begin 
    set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName
    +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
    +' order by '+ @fldSort +' '+ @strFSortType 
    end 
    end 
    else 
    begin 
    set @page = @pageIndex-@page+1 --后半部分数据处理 
    if @page <= 1 --最后一页数据显示 
    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
    else 
    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
    +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
    +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
    end 
    end 
    
    else --有查询条件 
    begin 
    if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理 
    begin 
    if @page=1 
    set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    +' where 1=1 ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType 
    else 
    begin 
    set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName
    +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' 
    +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType 
    end 
    end 
    else 
    begin 
    set @page = @pageIndex-@page+1 --后半部分数据处理 
    if @page <= 1 --最后一页数据显示 
    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
    else 
    set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
    +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
    +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' 
    +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType 
    end 
    end 
    
    ------返回查询结果----- 
    exec sp_executesql @strTmp 
    --print @strTmp 
    SET NOCOUNT OFF 
    GO 
    怎么在数据库中测试呢?
    1. declare @pageCount int   
    2. declare @Counts int   
    3. exec [dbo].[proc_ListPageInt] 'sysobjects', '* ', 20,1,@pageCount output,@Counts output,'id', 0,'','id',0  
    4. print @pageCount --这个可有可无   
    5. print @Counts --这个可有可无   
    declare @pageCount int 
    declare @Counts int 
    exec [dbo].[proc_ListPageInt] 'sysobjects', '* ', 20,1,@pageCount output,@Counts output,'id', 0,'','id',0
    print @pageCount --这个可有可无 
    print @Counts --这个可有可无 
    
    执行效果如下:

    分页存储过程二:

    1. USE [JianKunKingTestDatabase001]   
    2. GO   
    3.   
    4. /****** Object: StoredProcedure [dbo].[A_P_HelpPageShow] Script Date: 01/21/2015 19:19:42 ******/   
    5. SET ANSI_NULLS ON   
    6. GO   
    7.   
    8. SET QUOTED_IDENTIFIER ON   
    9. GO   
    10.   
    11.   
    12. ALTER PROCEDURE [dbo].[A_P_HelpPageShow]   
    13. (   
    14. @tblName nvarchar(max), -- 表名   
    15. @strGetFields varchar(1000) = '*', -- 需要返回的列   
    16. @fldName varchar(255)='', -- 排序的字段名   
    17. @PageSize int = 10, -- 页尺寸   
    18. @PageIndex int = 1, -- 页码   
    19. @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序   
    20. @strWhere varchar(1500) = '', -- 查询条件 (注意: 不要加 where)   
    21. @Counts int = 0 output --查询到的记录数   
    22. )   
    23. AS   
    24. declare @strSQL nvarchar(4000) -- 主语句   
    25. declare @strTmp nvarchar(110) -- 临时变量   
    26. declare @strOrder nvarchar(400) -- 排序类型   
    27. declare @totalRecord int --查询到的记录数   
    28. declare @SqlCounts nvarchar(max) ----对总数查询进行SQL构造   
    29. --计算总记录数   
    30. begin   
    31. if @strWhere !=''   
    32. set @SqlCounts = 'select @totalRecord=count(*) from ' + @tblName + ' where '+@strWhere  
    33. else   
    34. set @SqlCounts = 'select @totalRecord=count(*) from ' + @tblName + ''   
    35. end   
    36.   
    37. --print @strWhere   
    38. --print @SqlCounts   
    39. exec sp_executesql @SqlCounts,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数   
    40. set @Counts=@totalRecord   
    41.   
    42. begin   
    43.   
    44. if @OrderType != 0   
    45. begin   
    46. set @strTmp = '<(select min'   
    47. set @strOrder = ' order by ' + @fldName +' desc'   
    48. --如果@OrderType不是0,就执行降序,这句很重要!   
    49. end   
    50. else   
    51. begin   
    52. set @strTmp = '>(select max'   
    53. set @strOrder = ' order by ' + @fldName +' asc'   
    54. end   
    55. --print @strOrder   
    56. if @PageIndex = 1   
    57. begin   
    58. if @strWhere != ''   
    59. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder   
    60. else   
    61. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @tblName + ' '+ @strOrder   
    62. --如果是第一页就执行以上代码,这样会加快执行速度   
    63. end   
    64. else   
    65. begin   
    66. --以下代码赋予了@strSQL以真正执行的SQL代码   
    67. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '   
    68. + @tblName + ' where ' + @fldName + ' ' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + ' ' + @strOrder + ') as tblTmp)'+ @strOrder   
    69. --print @strSQL   
    70. if @strWhere != ''   
    71. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '   
    72. + @tblName + ' where ' + @fldName + ' ' + @strTmp + '('   
    73. + @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '   
    74. + @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '   
    75. + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder   
    76. end   
    77. end   
    78. --print @strSQL   
    79. exec sp_executesql @strSQL   
    80. GO   
    USE [JianKunKingTestDatabase001] 
    GO 
    
    /****** Object: StoredProcedure [dbo].[A_P_HelpPageShow] Script Date: 01/21/2015 19:19:42 ******/ 
    SET ANSI_NULLS ON 
    GO 
    
    SET QUOTED_IDENTIFIER ON 
    GO 
    
    
    ALTER PROCEDURE [dbo].[A_P_HelpPageShow] 
    ( 
    @tblName nvarchar(max), -- 表名 
    @strGetFields varchar(1000) = '*', -- 需要返回的列 
    @fldName varchar(255)='', -- 排序的字段名 
    @PageSize int = 10, -- 页尺寸 
    @PageIndex int = 1, -- 页码 
    @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序 
    @strWhere varchar(1500) = '', -- 查询条件 (注意: 不要加 where) 
    @Counts int = 0 output --查询到的记录数 
    ) 
    AS 
    declare @strSQL nvarchar(4000) -- 主语句 
    declare @strTmp nvarchar(110) -- 临时变量 
    declare @strOrder nvarchar(400) -- 排序类型 
    declare @totalRecord int --查询到的记录数 
    declare @SqlCounts nvarchar(max) ----对总数查询进行SQL构造 
    --计算总记录数 
    begin 
    if @strWhere !='' 
    set @SqlCounts = 'select @totalRecord=count(*) from ' + @tblName + ' where '+@strWhere
    else 
    set @SqlCounts = 'select @totalRecord=count(*) from ' + @tblName + '' 
    end 
    
    --print @strWhere 
    --print @SqlCounts 
    exec sp_executesql @SqlCounts,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数 
    set @Counts=@totalRecord 
    
    begin 
    
    if @OrderType != 0 
    begin 
    set @strTmp = '<(select min' 
    set @strOrder = ' order by ' + @fldName +' desc' 
    --如果@OrderType不是0,就执行降序,这句很重要! 
    end 
    else 
    begin 
    set @strTmp = '>(select max' 
    set @strOrder = ' order by ' + @fldName +' asc' 
    end 
    --print @strOrder 
    if @PageIndex = 1 
    begin 
    if @strWhere != '' 
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder 
    else 
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @tblName + ' '+ @strOrder 
    --如果是第一页就执行以上代码,这样会加快执行速度 
    end 
    else 
    begin 
    --以下代码赋予了@strSQL以真正执行的SQL代码 
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' 
    + @tblName + ' where ' + @fldName + ' ' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + ' ' + @strOrder + ') as tblTmp)'+ @strOrder 
    --print @strSQL 
    if @strWhere != '' 
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' 
    + @tblName + ' where ' + @fldName + ' ' + @strTmp + '(' 
    + @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' ' 
    + @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' ' 
    + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder 
    end 
    end 
    --print @strSQL 
    exec sp_executesql @strSQL 
    GO 
    怎么在数据库中测试呢?
    1. select count(*) from sysobjects ;  
    2. declare @CountsAA int   
    3. exec [dbo].[A_P_HelpPageShow] 'sysobjects', '* ', 'id ',20, 1,1, ' ',@CountsAA output   
    4. print @CountsAA --这个可有可无  
    select count(*) from sysobjects ;
    declare @CountsAA int 
    exec [dbo].[A_P_HelpPageShow] 'sysobjects', '* ', 'id ',20, 1,1, ' ',@CountsAA output 
    print @CountsAA --这个可有可无
    执行结果如下:

    存储过程二(优化版)

    1. USE [JianKunKingTestDatabase001]  
    2. GO  
    3.   
    4. /****** Object:  StoredProcedure [dbo].[A_P_HelpPageShow]    Script Date: 01/30/2015 20:21:13 ******/  
    5. SET ANSI_NULLS ON  
    6. GO  
    7.   
    8. SET QUOTED_IDENTIFIER ON  
    9. GO  
    10.   
    11.   
    12. CREATE  PROCEDURE [dbo].[A_P_HelpPageShow]  
    13. (  
    14. @TableName   nvarchar(max),       -- 表名  
    15. @strGetFields varchar(1000) = '*', -- 需要返回的列   
    16. @OrderField varchar(255)='',      -- 排序的字段名  
    17. @PageSize   int = 10,          -- 页尺寸  
    18. @PageIndex int = 1,          -- 页码  
    19. @strWhere varchar(1500) = '', -- 查询条件 (注意: 不要加 where)  
    20. @Counts    int = 0  output  --查询到的记录数  
    21. )  
    22. AS  
    23. declare @strSQL   nvarchar(4000)       -- 主语句  
    24. declare @totalRecord int  --查询到的记录数  
    25. declare @SqlCounts nvarchar(max)     ----对总数查询进行SQL构造  
    26. --计算总记录数  
    27. begin  
    28.     if @strWhere !=''  
    29. set @SqlCounts = 'select @totalRecord=count(*)  from ' + @TableName + ' where '+@strWhere  
    30.     else  
    31. set @SqlCounts = 'select @totalRecord=count(*)  from ' + @TableName + ''   
    32. end   
    33.   
    34. exec sp_executesql @SqlCounts,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数  
    35. set  @Counts=@totalRecord   
    36.   
    37. BEGIN  
    38. IF (@strWhere='' or @strWhere IS NULL)  
    39. SET @strSQL = 'Select * FROM (select ' + @strGetFields + ',ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId from ' + @TableName  
    40. ELSE  
    41. SET @strSQL = 'Select * FROM (select ' + @strGetFields + ',ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId from ' + @TableName + ' where ' + @strWhere      
    42. END  
    43.  --处理页数超出范围情况   
    44.     IF @PageIndex<=0   
    45.         SET @PageIndex = 1  
    46.         
    47.      --处理开始点和结束点  
    48.     DECLARE @StartRecord INT   
    49.     DECLARE @EndRecord int  
    50.       
    51.     SET @StartRecord = (@pageIndex-1)*@PageSize + 1  
    52.     SET @EndRecord = @StartRecord + @PageSize - 1  
    53.   
    54.      --继续合成sql语句  
    55.     SET @strSQL = @strSQL + ') as tempTable where rowId >=' + CONVERT(VARCHAR(50),@StartRecord) + ' and rowid<= ' + CONVERT(VARCHAR(50),@EndRecord)  
    56.   
    57. exec sp_executesql @strSQL  
    58.   
    59.   
    60. GO  
    USE [JianKunKingTestDatabase001]
    GO
    
    /****** Object:  StoredProcedure [dbo].[A_P_HelpPageShow]    Script Date: 01/30/2015 20:21:13 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    CREATE  PROCEDURE [dbo].[A_P_HelpPageShow]
    (
    @TableName   nvarchar(max),       -- 表名
    @strGetFields varchar(1000) = '*', -- 需要返回的列 
    @OrderField varchar(255)='',      -- 排序的字段名
    @PageSize   int = 10,          -- 页尺寸
    @PageIndex int = 1,          -- 页码
    @strWhere varchar(1500) = '', -- 查询条件 (注意: 不要加 where)
    @Counts    int = 0  output  --查询到的记录数
    )
    AS
    declare @strSQL   nvarchar(4000)       -- 主语句
    declare @totalRecord int  --查询到的记录数
    declare @SqlCounts nvarchar(max)     ----对总数查询进行SQL构造
    --计算总记录数
    begin
        if @strWhere !=''
    set @SqlCounts = 'select @totalRecord=count(*)  from ' + @TableName + ' where '+@strWhere
        else
    set @SqlCounts = 'select @totalRecord=count(*)  from ' + @TableName + '' 
    end 
    
    exec sp_executesql @SqlCounts,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数
    set  @Counts=@totalRecord 
    
    BEGIN
    IF (@strWhere='' or @strWhere IS NULL)
    SET @strSQL = 'Select * FROM (select ' + @strGetFields + ',ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId from ' + @TableName
    ELSE
    SET @strSQL = 'Select * FROM (select ' + @strGetFields + ',ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId from ' + @TableName + ' where ' + @strWhere    
    END
     --处理页数超出范围情况 
        IF @PageIndex<=0 
            SET @PageIndex = 1
          
         --处理开始点和结束点
        DECLARE @StartRecord INT 
        DECLARE @EndRecord int
        
        SET @StartRecord = (@pageIndex-1)*@PageSize + 1
        SET @EndRecord = @StartRecord + @PageSize - 1
    
         --继续合成sql语句
        SET @strSQL = @strSQL + ') as tempTable where rowId >=' + CONVERT(VARCHAR(50),@StartRecord) + ' and rowid<= ' + CONVERT(VARCHAR(50),@EndRecord)
    
    exec sp_executesql @strSQL
    
    
    GO
    
    拓展:http://blog.csdn.net/jiankunking/article/details/43339301
  • 相关阅读:
    C#.net开发 List与DataTable相互转换
    asp.net 7.分页
    PostgreSQL 创建触发器 Trigger
    PostgreSQL 的命令行工具 psql 的常用命令
    安装SQL Server DQS 和 MDS
    Ubuntu ssh-keygen 生成公钥并添加到远程服务器上
    阿里云code基础文档
    忘记本地MySQL数据库密码的解决方法
    谷歌浏览器安装jsonview
    phpstorm汉化包
  • 原文地址:https://www.cnblogs.com/freeliver54/p/7323672.html
Copyright © 2011-2022 走看看