SQLServer 分页存储过程
2011-08-07 19:30
441 查看
--DROP TABLE tangfuqiang
create table tangfuqiang(
tfqId_int int identity(1,1) primary key,
tfqName_nvarchar nvarchar(30),
tfqPwd_nvarchar nvarchar(30),
tfqRemark_nvarchar nvarchar(300)
)
go
select * from tangfuqiang
go
/*采用一般的写法插入100条记录*/
DECLARE @index int
SET @index=1
WHILE @index < 100
BEGIN
INSERT INTO tangfuqiang VALUES('tfq'+CONVERT(nvarchar,@index),'pwd'+CONVERT(nvarchar,@index),''+CONVERT(nvarchar,@index));
SET @index +=1;
END
/*采用创建储存过程插入100条记录*/
--DROP PROCEDURE proc_Insert
CREATE PROCEDURE proc_Insert
AS
DECLARE @index int
SET @index=1
WHILE @index < 100
BEGIN
INSERT INTO tangfuqiang VALUES('tfq'+CONVERT(nvarchar,@index),'pwd'+CONVERT(nvarchar,@index),''+CONVERT(nvarchar,@index));
SET @index +=1;
END
/*调用储存过程*/
execute proc_Insert
/**
声明,这个高性能分页存储过程只适合表主键为自增类型,不适合用主键采用uniqueidentifier类型的表源代码如下
**/
create PROCEDURE pageShow
@tb varchar(512), --表名
@collist varchar(2048), --要查询出的字段列表,*表示全部字段
@top int, --最多读取记录数
@pagesize int, --每页记录数
@page int, --指定页
@condition varchar(2048), --查询条件
@sql_key varchar(20), --用于排序的主键
@col varchar(50), --用于排序,如:id desc (多个id desc,dt asc)
@orderby bit, --排序,0-顺序,1-倒序
@pages int OUTPUT --总页数
AS
SET NOCOUNT ON
Declare @sqlcount Int
Begin Tran
DECLARE @sql nvarchar(4000),@where1 varchar(800),@where2 varchar(800)
IF @condition is null or rtrim(@condition)=''
BEGIN--没有查询条件
SET @where1=' WHERE '
SET @where2=' '
END
ELSE
BEGIN--有查询条件
SET @where1=' WHERE ('+@condition+') AND '--本来有条件再加上此条件
SET @where2=' WHERE ('+@condition+') '--原本没有条件而加上此条件
END
--SET @sql='SELECT @intResult=COUNT(*) FROM '+@tb+@where2
SET @sql='SELECT @sqlcount=COUNT(*) FROM (select top '+ cast(@top as varchar(8)) +'
'+@sql_key+' from '+ @tb + @where2 +') As tmptab'
--print @sql
EXEC sp_executesql @sql,N'@sqlcount int OUTPUT',@sqlcount OUTPUT--计算总记录数
SELECT @pages=CEILING((@sqlcount+0.0)/@pagesize) --计算总页数
IF @page=1--第一页
BEGIN
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar(10))+'
'+@collist+' FROM '+@tb+
@where2+'ORDER BY '+ @col
END
Else
BEGIN
IF @orderby=0
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar(10))+'
'+@collist+ ' FROM '+@tb+@where1+@sql_key+'>(SELECT MAX('+@sql_key+') '+ ' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar(10))+' '+
@sql_key+' FROM '+@tb+@where2+'ORDER BY
'+@col+') t) ORDER BY '+@col
ELSE
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar(10))+'
'+@collist+' FROM '+@tb+@where1+@sql_key+'<(SELECT MIN('+@sql_key+') '+ ' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar(10))+' '+
@sql_key+' FROM '+@tb+@where2+'ORDER BY
'+@col+') t) ORDER BY '+@col+''
END
EXEC(@sql)
--print @sql
If @@Error <> 0
Begin
RollBack Tran
Return -1
End
Else
Begin
Commit Tran
Return @sqlcount
End
/*调用分页储存过程*/
EXECUTE pageShow 'tangfuqiang','*',10,5,1,'','tfqId_int','tfqId_int',1,80
create table tangfuqiang(
tfqId_int int identity(1,1) primary key,
tfqName_nvarchar nvarchar(30),
tfqPwd_nvarchar nvarchar(30),
tfqRemark_nvarchar nvarchar(300)
)
go
select * from tangfuqiang
go
/*采用一般的写法插入100条记录*/
DECLARE @index int
SET @index=1
WHILE @index < 100
BEGIN
INSERT INTO tangfuqiang VALUES('tfq'+CONVERT(nvarchar,@index),'pwd'+CONVERT(nvarchar,@index),''+CONVERT(nvarchar,@index));
SET @index +=1;
END
/*采用创建储存过程插入100条记录*/
--DROP PROCEDURE proc_Insert
CREATE PROCEDURE proc_Insert
AS
DECLARE @index int
SET @index=1
WHILE @index < 100
BEGIN
INSERT INTO tangfuqiang VALUES('tfq'+CONVERT(nvarchar,@index),'pwd'+CONVERT(nvarchar,@index),''+CONVERT(nvarchar,@index));
SET @index +=1;
END
/*调用储存过程*/
execute proc_Insert
/**
声明,这个高性能分页存储过程只适合表主键为自增类型,不适合用主键采用uniqueidentifier类型的表源代码如下
**/
create PROCEDURE pageShow
@tb varchar(512), --表名
@collist varchar(2048), --要查询出的字段列表,*表示全部字段
@top int, --最多读取记录数
@pagesize int, --每页记录数
@page int, --指定页
@condition varchar(2048), --查询条件
@sql_key varchar(20), --用于排序的主键
@col varchar(50), --用于排序,如:id desc (多个id desc,dt asc)
@orderby bit, --排序,0-顺序,1-倒序
@pages int OUTPUT --总页数
AS
SET NOCOUNT ON
Declare @sqlcount Int
Begin Tran
DECLARE @sql nvarchar(4000),@where1 varchar(800),@where2 varchar(800)
IF @condition is null or rtrim(@condition)=''
BEGIN--没有查询条件
SET @where1=' WHERE '
SET @where2=' '
END
ELSE
BEGIN--有查询条件
SET @where1=' WHERE ('+@condition+') AND '--本来有条件再加上此条件
SET @where2=' WHERE ('+@condition+') '--原本没有条件而加上此条件
END
--SET @sql='SELECT @intResult=COUNT(*) FROM '+@tb+@where2
SET @sql='SELECT @sqlcount=COUNT(*) FROM (select top '+ cast(@top as varchar(8)) +'
'+@sql_key+' from '+ @tb + @where2 +') As tmptab'
--print @sql
EXEC sp_executesql @sql,N'@sqlcount int OUTPUT',@sqlcount OUTPUT--计算总记录数
SELECT @pages=CEILING((@sqlcount+0.0)/@pagesize) --计算总页数
IF @page=1--第一页
BEGIN
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar(10))+'
'+@collist+' FROM '+@tb+
@where2+'ORDER BY '+ @col
END
Else
BEGIN
IF @orderby=0
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar(10))+'
'+@collist+ ' FROM '+@tb+@where1+@sql_key+'>(SELECT MAX('+@sql_key+') '+ ' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar(10))+' '+
@sql_key+' FROM '+@tb+@where2+'ORDER BY
'+@col+') t) ORDER BY '+@col
ELSE
SET @sql='SELECT TOP '+CAST(@pagesize AS varchar(10))+'
'+@collist+' FROM '+@tb+@where1+@sql_key+'<(SELECT MIN('+@sql_key+') '+ ' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar(10))+' '+
@sql_key+' FROM '+@tb+@where2+'ORDER BY
'+@col+') t) ORDER BY '+@col+''
END
EXEC(@sql)
--print @sql
If @@Error <> 0
Begin
RollBack Tran
Return -1
End
Else
Begin
Commit Tran
Return @sqlcount
End
/*调用分页储存过程*/
EXECUTE pageShow 'tangfuqiang','*',10,5,1,'','tfqId_int','tfqId_int',1,80
相关文章推荐
- 分页存储过程(二)在sqlserver中返回更加准确的分页结果
- SQLSERVER一个比较不错的分页存储过程p_splitpage
- SQLSERVER分页通用存储过程
- sqlserver 读取多个表的分页存储过程(参考)
- SQL Server 存储过程的分页方案比拼,以及SQLServer的API服务游标信息!
- SQLServer 分页存储过程
- SQLServer千万数量级分页公共存储过程
- sqlserver 通用存储过程分页代码(附使用ROW_NUMBER()和不使用ROW_NUMBER()两种情况性能分析)
- SQLserver_分页的存储过程
- 简单sqlserver 分页存储过程创建 及调用
- 【转】SqlServer 数据分页的存储过程
- sqlserver 高效分页的存储过程 基于ROW_NUMBER()
- SqlServer通用的分页存储过程
- sqlserver 存储过程分页代码第1/2页
- 最热网友收藏:利用SqlServer内部存储过程实现快速方便的分页(2007年第7周)
- 数据库操作 sqlserver查询存储过程+分页
- SqlServer 2000、2005分页存储过程整理第1/3页
- sqlserver 使用游标存储过程分页
- SQLServer 实现分页的通用存储过程
- 一个通用的分页存储过程实现-SqlServer(附上sql源码,一键执行即刻搭建运行环境)