[转]Sql Server 分页存储过程
本文转自:
版权声明:作者:jiankunking 出处:http://blog.csdn.net/jiankunking 本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
分页存储过程一:
- --/*-----存储过程 分页处理 孙伟 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
--/*-----存储过程 分页处理 孙伟 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
怎么在数据库中测试呢?
- 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 --这个可有可无
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 --这个可有可无
执行效果如下:
分页存储过程二:
- 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
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
怎么在数据库中测试呢?
- select count(*) from sysobjects ;
- declare @CountsAA int
- exec [dbo].[A_P_HelpPageShow] 'sysobjects', '* ', 'id ',20, 1,1, ' ',@CountsAA output
- print @CountsAA --这个可有可无
select count(*) from sysobjects ;
declare @CountsAA int
exec [dbo].[A_P_HelpPageShow] 'sysobjects', '* ', 'id ',20, 1,1, ' ',@CountsAA output
print @CountsAA --这个可有可无
执行结果如下:
存储过程二(优化版)
- 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
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
[转]Sql Server 分页存储过程的更多相关文章
- C#调用SQL Server分页存储过程
以SQL Server2012提供的offset ..rows fetch next ..rows only为例 e.g. 表名:Tab1 ------------------------------ ...
- 分页系列之一:SQL Server 分页存储过程
以下为最基本的代码结构,SQL Server 2012 开始支持 CREATE PROCEDURE procXXX @Page int, --当前页码,从1开始 @PageSize int --每页记 ...
- sql server 分页存储过程
----------------------分页存储过程------------------------------------------------------------------------ ...
- sql server分页存储过程
因项目需要,一次性查询出来的数据过大,内存hold不住,所以特意写成分页查询,减小占用内存. 存储过程如下: USE [XXX] GO SET ANSI_NULLS ON GO SET QUOTED_ ...
- SQL Server分页存储过程通用存储过程
CREATE proc [dbo].[p_paging]@tableName varchar(8000), --表名.视图名@indexCol varchar(50) = 'id', ...
- SQL Server分页存储过程笔记
USE [database] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[ProcedureN ...
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
SQL Server游标 转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...
- SQL server分页的四种方法
SQL server分页的四种方法 1.三重循环: 2.利用max(主键); 3.利用row_number关键字: 4.offset/fetch next关键字 方法一:三重循环思路 先取前20页, ...
- SQL server分页的四种方法(算很全面了)
这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及到具体例子的,设定查询第2 ...
随机推荐
- DataGridView添加一行数据、全选、取消全选、清空数据、删除选中行
.net 2005下的Windows Form Application,一个DataGridView控件和4个Button,界面设置如下: 代码如下,有注解,相信大家都看得明白: ...
- 如何处理加括号的四则混合运算表达式——基于二叉树的实现(Eclipse平台 Java版)
记得上<数据结构>课程时,利用栈的特性解决过四则混合运算表达式.而如今在编写小型关系数据库的时候,编译部分要处理where后面的逻辑表达式——检查语法正确与否的同时,还要将信息传给下一个接 ...
- django系列6--Ajax04 请求设置(设置csrf_token)
Ajax请求设置csrf_token 官方文档 csrf_token: https://docs.djangoproject.com/en/1.11/ref/csrf/ CSRF 跨站请求攻击,简单地 ...
- ClamAV学习【6】—— cli_load函数浏览
(老爸回家,就放开心和他到处走,累……趁其和老妈聊天之际,再继续看代码) 参数选项,加载病毒都浏览得七七八八了,这里就贴个简单的函数注释吧.哈哈. 代码注释如下: int cli_load(const ...
- Kali Linux来袭~老司机带你进击
Kali是BackTrackLinux完全遵循Debian开发标准彻底的完全重建.全新的目录框架,复查并打包所有工具,我们还为VCS建立了Git树. 本次推荐内容主要介绍Kali-Linux的安装,包 ...
- 点击文字,把input type="radio"也选中
本文原文地址:https://my.oschina.net/jack088/blog/469815 1. <label> <input type="radio" ...
- 我从Linux走来,选择了Windows
我从Linux走来,选择了Windows 几天前就想提笔写下这篇,理解很多人一定会对言论不苟同. 但是我相信您看完一个一年多的Linux用户写完的以后,一定也不会太反对 一.为什么我成为一名 Linu ...
- [总结帖] 后端MVC V.S. 前端MVVM
Web编年史: Web1.0 —— 静态页面.简单预处理语言草案:PHP.JSP.ASP Web2.0 —— 企业级架构.一站式解决方案(MVC):J2EE.Spring.Asp.net Web2.5 ...
- 代码 | 自适应大邻域搜索系列之(3) - Destroy和Repair方法代码实现解析
前言 上一篇文章中我们具体解剖了ALNS类的具体代码实现过程,不过也留下了很多大坑.接下来的文章基本都是"填坑"了,把各个模块一一展现解析给大家.不过碍于文章篇幅等原因呢,也不会每 ...
- 我永远喜欢我的偶像 KIKU