mssql分页存储过程

本文转自百度文库http://wenku.baidu.com/view/8f6ec149fe4733687e21aa72.html

必须有主键

原代码

Codeuse users
go

if exists(select name from sysobjects where name='pages' and xtype='p')
drop proc pages
go

CREATE PROC pages
@tblName varchar(255),		-- 表名
@strGetFields varchar(1000),		-- 需要返回的列 
@fldName varchar(255),		-- 排序的字段名
@PageSize int,				-- 多少条/页
@PageIndex int,				-- 页码
@doCount bit,					-- 返回记录总数, 0不返回,1返回
@OrderType bit,				-- 设置排序类型, 0升序,1降序
@strWhere varchar(1500)		-- 查询条件 (注意: 不要加 where)
AS

declare @strSQL varchar(5000) 	--主语句
declare @strTmp varchar(150)  	--临时变量
declare @strOrder varchar(400)	--排序类型

--如果@doCount传递过来的不是0,就执行总数统计。
if @doCount != 0
	begin
		--查询条件为空
		set @strSQL = 'select count(*) as Total from ' + @tblName
		--查询条件不为空
		if @strWhere !=''
			set @strSQL = 'select count(*) as Total from ' + @tblName + ' where '+@strWhere
	end 

--以下的所有代码都是@doCount为0的情况:
--如果@OrderType是1,就执行降序,否则为升序!
else
	begin
		--查询条件为空
		set @strTmp = '>(select max'
		set @strOrder = ' order by ' + @fldName +' asc'
		--查询条件不为空
		if @OrderType = 1
			begin
				set @strTmp = '<(select min'
				set @strOrder = ' order by ' + @fldName +' desc'
			end

		--如果是第一页就执行代码,这样会加快执行速度
		if @PageIndex = 1
			begin
				--查询条件为空
				set @strSQL='select top '+str(@PageSize)+''+@strGetFields+' from '+@tblName+''+@strOrder
				--如果查询条件不为空,
				if @strWhere != '' 
					set @strSQL='select top '+str(@PageSize)+''+@strGetFields+' from '+@tblName+' where '+@strWhere+''+@strOrder
			end
		--如果不是第一页,则
		else
			begin
			--以下代码赋予了@strSQL以真正执行的SQL代码

				--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


				--如果查询条件不为空,则另写sql语句
				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 
exec (@strSQL)
GO

--运行存储过程pages
--表名varchar,要返回的列名(*为返回所有)varchar,排序的列varchar,每页显示数量int,
--第几页int,是否统计总数bit,是否降序排列bit,排列条件(不要带where)varchar

--统计borrow表的记录数量
exec pages 'uu','*','',0,0,1,0,''
--按borrowid排倒序分别显示1、2、3页的信息
exec pages 'uu','*','uid',4,1,0,1,''
exec pages 'uu','*','uid',4,2,0,1,'uid is not null'
exec pages 'uu','*','uid',4,3,0,1,''

 简单改造,调整了参数的顺序,重新进行了命名,以符合的我的使用习惯

 1 if exists(select name from sysobjects where name='pages' and xtype='p')
 2 drop proc pages
 3 go
 4 
 5 CREATE PROC pages
 6 @bit_DoCount BIT   ,         -- 返回记录总数, 0不返回,1返回
 7 @str_tblName varchar(255),      -- 表名
 8 @str_SelectFields varchar(1000),  -- 需要返回的列(所有字段*)
 9 @str_Where varchar(1500),          -- 查询条件 (注意: 不要加 where)
10 @str_PkField varchar(255),        --主键名称(决定着取出来的记录)
11 @bit_OrderType bit,               -- 设置排序类型, 0升序,1降序
12 @int_PageSize int,                  -- 多少条/页
13 @int_PageIndex int                 -- 页码
14 AS
15 
16 declare @strSQL varchar(5000)     --主语句
17 declare @strTmp varchar(150)      --临时变量
18 declare @strOrder varchar(400)    --排序类型
19 
20 --如果@doCount传递过来的不是0,就执行总数统计。
21 if @bit_DoCount != 0
22     begin
23         --查询条件为空
24         set @strSQL = 'select count(*) as Total from ' + @str_tblName
25         --查询条件不为空
26         if @str_Where !=''
27             set @strSQL = 'select count(*) as Total from ' + @str_tblName + ' where '+@str_Where
28     end 
29 
30 --以下的所有代码都是@doCount为0的情况:
31 --如果@OrderType是1,就执行降序,否则为升序!
32 else
33     begin
34         --查询条件为空
35         set @strTmp = '>(select max'
36         set @strOrder = ' order by ' + @str_PkField +' asc'
37         --查询条件不为空
38         if @bit_OrderType = 1
39             begin
40                 set @strTmp = '<(select min'
41                 set @strOrder = ' order by ' + @str_PkField +' desc'
42             end
43 
44         --如果是第一页就执行代码,这样会加快执行速度
45         if @int_PageIndex = 1
46             begin
47                 --查询条件为空
48                 set @strSQL='select top '+str(@int_PageSize)+' '+@str_SelectFields+' from '+@str_tblName+' '+@strOrder
49                 --如果查询条件不为空,
50                 if @str_Where != '' 
51                     set @strSQL='select top '+str(@int_PageSize)+' '+@str_SelectFields+' from '+@str_tblName+' where '+@str_Where+' '+@strOrder
52             end
53         --如果不是第一页,则
54         else
55             begin
56             --以下代码赋予了@strSQL以真正执行的SQL代码
57 
58                 --sql查询语句
59                 set @strSQL = 'select top ' + str(@int_PageSize) +' '+@str_SelectFields+ ' from '
60                         + @str_tblName + ' where ' + @str_PkField + '' + @strTmp + '('
61                         + @str_PkField + ') from (select top ' + str((@int_PageIndex-1)*@int_PageSize) + ' '
62                         + @str_PkField + ' from ' + @str_tblName + '' + @strOrder + ') as tblTmp)'+ @strOrder
63 
64 
65                 --如果查询条件不为空,则另写sql语句
66                 if @str_Where != ''
67                     set @strSQL = 'select top ' + str(@int_PageSize) +' '+@str_SelectFields+ ' from '
68                             + @str_tblName + ' where ' + @str_PkField + '' + @strTmp + '('
69                             + @str_PkField + ') from (select top ' + str((@int_PageIndex-1)*@int_PageSize) + ' '
70                             + @str_PkField + ' from ' + @str_tblName + ' where ' + @str_Where + ' '
71                             + @strOrder + ') as tblTmp) and ' + @str_Where + ' ' + @strOrder
72             end 
73     end 
74     PRINT @strSQL 
75 exec (@strSQL)
76 GO
View Code

 

转载于:https://www.cnblogs.com/ByBull/p/3355339.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值