[转]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

posted on 2017-08-09 09:59  freeliver54  阅读(307)  评论(0编辑  收藏  举报

导航