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
  • 相关阅读:
    learnyou 相关网站
    hdu 3038 How Many Answers Are Wrong
    hdu 3047 Zjnu Stadium 并查集高级应用
    poj 1703 Find them, Catch them
    poj 1182 食物链 (带关系的并查集)
    hdu 1233 还是畅通工程
    hdu 1325 Is It A Tree?
    hdu 1856 More is better
    hdu 1272 小希的迷宫
    POJ – 2524 Ubiquitous Religions
  • 原文地址:https://www.cnblogs.com/freeliver54/p/7323672.html
Copyright © 2011-2022 走看看