SQL SERVER用sql高效分页存储过程程分页的几种方法

SQL server 2008 存储过程分页实现,怎么提升效率_百度知道
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
SQL server 2008 存储过程分页实现,怎么提升效率
我有更好的答案
0*@rowcount&#47,16,@currentpage, --查询字符串@currentpage int, --第N页@pagesize int --每页行数asset nocount ondeclare @P1 int, --P1是游标的id@rowcount intexec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount outputselect ceiling(1,@rowcount as 总行数,@currentpage as 当前页 set @currentpage=(@currentpage-1)*@pagesize+1exec sp_cursorfetch @P1;@pagesize) as 总页数--create procedure queryPage@sqlstr nvarchar(4000)
采纳率:84%
为您推荐:
换一换
回答问题,赢新手礼包sqlserver2005中的万能分页存储过程。–建立主表临时表
CREATE TABLE #temp
rownumber bigint,
orderseqno VARCHAR(36),
goodsname VARCHAR(50),
companyname VARCHAR(100)
–建立子表临 时表
CREATE TABLE #detail
orderseqno VARCHAR(36),
detailid UNIQUEIDENTIFIER,
unitprice DECIMAL(12,2),
–插入主表数据到主表临时表
insert into #temp
SELECT oo.rownumber, oo.OrderSeqNO, oo.GoodsName, oo.CompanyName FROM
(SELECT ROW_NUMBER () OVER (ORDER BY oi.createdate DESC) AS rownumber,
oi.OrderSeqNO, oi.GoodsName ,ci.CompanyName
FROM OrderInfo oi INNER JOIN CompanyInfo ci panyID
WHERE oi.CreateDate&GETDATE()
WHERE rownumber BETWEEN 10 AND 20
–定义游标
DECLARE @temp_cursor CURSOR
–给游标赋值
SET @temp_cursor=CURSOR FOR SELECT #temp.orderseqno,#temp.goodsname FROM #temp
–定义游标循环过程中所需保存的临时数据
DECLARE @orderseqno VARCHAR(36),@goodsname varchar(50)
–打开游标
OPEN @temp_cursor
FETCH NEXT FROM @temp_cursor INTO @orderseqno,@goodsname
–循环游标,查询子表数据,然后插入子表临时表
WHILE @@FETCH_STATUS=0
INSERT INTO #detail
SELECT od.OrderSeqNO,od.OrderDetailID, od.UnitPrice,od.Qty
FROM OrderDetail od
WHERE od.OrderSeqNO=@orderseqno
FETCH NEXT FROM @temp_cursor INTO @orderseqno,@goodsname
–关闭游标
CLOSE @temp_cursor
DEALLOCATE @temp_cursor
SELECT * FROM #temp
SELECT * FROM #detail
–删除临时表
DROP TABLE #temp
DROP TABLE #detail
以上的T-SQL只在SQL Server 2005上测试成功。
浏览: 85818 次
WebUI最新版免费下载
居然有美女程序员。
低头做事,抬头做人过幸福的小日子 ,很不错的心态
心态非常好,也会让你的团队和客户感觉比较舒服的
我的上司就是女的,架构师,不是一般的厉害啊!女人不可小嘘啊 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'相关文章推荐
create procedure proc_page_withtopmax
@pageIndex int,--页索引
@pageSize int,--每页显示数
@pageCount in...
大家百度一下这个标题立马会出现很多相关信息,都大同小异,我自己拷贝的一个,应项目的需要,修改了一个排序的bug以及添加了返回总记录数,如下:SET ANSI_NULLS ONGOSET QUOTED_...
转自:http://blog.csdn.net/tem168/article/details/6427123
SQLServer千万数量级分页公共存储过程
通用的数据库分页存...
分页存储过程一:
--/*-----存储过程 分页处理 孙伟 创建 -------*/
--/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 --...
自开始做项目以来,一直在用。这段存储过程的的原创者(SORRY,忘记名字了),写得这段SQL代码很不错,我在这个基础上,按照我的习惯以及思维方式,调整了代码,只做分页查询用。/**//*-------...
本文来自:/news/180.html
本文导读:ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的...
ALTER Procedure [dbo].[QuickPage]@strTableName
varchar(50),
--表名@strFieldList
varchar(1000...
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)SQL SERVER 2008 中三种分页方法与比较
字体:[ ] 类型:转载 时间:
SQL SERVER 2008 中三种分页方法与比较,需要的朋友可以参考一下
建立表: 代码如下:CREATE TABLE [TestTable] (&[ID] [int] IDENTITY (1, 1) NOT NULL ,&[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,&[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,&[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,&[Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY]GO插入数据:(2万条,用更多的数据测试会明显一些)SET IDENTITY_INSERT TestTable ONdeclare @i intset @i=1while @i&=20000begin&&& insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')&&& set @i=@i+1endSET IDENTITY_INSERT TestTable OFF
分页方案一:(利用Not In和SELECT TOP分页)
语句形式: 代码如下:SELECT TOP 10 *FROM TestTableWHERE (ID NOT IN&&&&&&&&& (SELECT TOP 20 id&&&&&&&& FROM TestTable&&&&&&&& ORDER BY id))ORDER BY ID
SELECT TOP 页大小 *FROM TestTableWHERE (ID NOT IN&&&&&&&&& (SELECT TOP 页大小*页数 id&&&&&&&& FROM 表&&&&&&&& ORDER BY id))ORDER BY ID
分页方案二:(利用ID大于多少和SELECT TOP分页)语句形式: 代码如下:SELECT TOP 10 *FROM TestTableWHERE (ID &&&&&&&&&& (SELECT MAX(id)&&&&&&&& FROM (SELECT TOP 20 id&&&&&&&&&&&&&&&& FROM TestTable&&&&&&&&&&&&&&&& ORDER BY id) AS T))ORDER BY ID
SELECT TOP 页大小 *FROM TestTableWHERE (ID &&&&&&&&&& (SELECT MAX(id)&&&&&&&& FROM (SELECT TOP 页大小*页数 id&&&&&&&&&&&&&&&& FROM 表&&&&&&&&&&&&&&&& ORDER BY id) AS T))ORDER BY ID
分页方案三:(利用SQL的游标存储过程分页) 代码如下:create& procedure XiaoZhengGe@sqlstr nvarchar(4000), --查询字符串@currentpage int, --第N页@pagesize int --每页行数asset nocount ondeclare @P1 int, --P1是游标的id&@rowcount intexec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount outputselect ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 set @currentpage=(@currentpage-1)*@pagesize+1exec sp_cursorfetch @P1,16,@currentpage,@pagesize exec sp_cursorclose @P1set nocount off
其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。建议优化的时候,加上主键和索引,查询效率会提高。通过SQL 查询分析器,显示比较:我的结论是:分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句分页方案一:(利用Not In和SELECT TOP分页)&& 效率次之,需要拼接SQL语句分页方案三:(利用SQL的游标存储过程分页)&&& 效率最差,但是最为通用在实际情况中,要具体分析。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具& & & & 从SQLSERVER 2005开始,提供了Row_Number()函数,利用函数生成的Index来处理分页,按照正常的逻辑思维都是传pageIndex和pageSize来完成分页,昨天前端和我沟通,他们使用jQuery.DataTable.js插件,而且经过了公司底层的封装,pageIndex需要变动一下,变成pageIndex*pageSize来传。 也就是说按每页显示30条算,第一次传0,第二次传30这样来计算,我也是醉了。
1、传pageIndex和pageSize
CREATE PROC [dbo].[Common_PageList]
@tab nvarchar(max),---表名
@strFld nvarchar(max), --字段字符串
@strWhere varchar(max), --where条件
@PageIndex int, --页码
@PageSize int, --每页容纳的记录数
@Sort VARCHAR(255), --排序字段及规则,不用加order by
@IsGetCount bit
--是否得到记录总数,1为得到记录总数,0为不得到记录总数,返回记录集
declare @strSql nvarchar(max)
set nocount on;
if(@IsGetCount = 1)
set @strSql='SELECT COUNT(0) FROM ' + @tab + ' WHERE ' + @strWhere
set @strSql=' SELECT * FROM (SELECT ROW_NUMBER()
OVER(ORDER BY ' + @Sort + ') AS rownum, ' + @strFld + ' FROM ' + @tab + ' where ' + @strWhere + ') AS Dwhere
WHERE rownum BETWEEN ' + CAST(((@PageIndex-1)*@PageSize + 1) as nvarchar(20)) + ' and ' + cast((@PageIndex*@PageSize) as nvarchar(20))
exec (@strSql)
set nocount off;
2、传pageIndex*pageSize和pageSize
CREATE PROC [dbo].[Common_PageList2]
@tab nvarchar(max),---表名
@strFld nvarchar(max), --字段字符串
@strWhere varchar(max), --where条件
@StartIndex int, -- 开始行数
@PageSize int, --每页容纳的记录数
@Sort VARCHAR(255), --排序字段及规则,不用加order by
@IsGetCount bit
--是否得到记录总数,1为得到记录总数,0为不得到记录总数,返回记录集
DECLARE @strSql NVARCHAR(max)
SET NOCOUNT ON;
IF(@IsGetCount = 1)
SET @strSql='SELECT COUNT(0) FROM ' + @tab + ' WHERE ' + @strWhere
DECLARE @ENDINDEX INT
IF(@StartIndex&0)
SET @ENDINDEX=@StartIndex+@PageSize
SET @StartIndex=@StartIndex+1
SET @ENDINDEX=@StartIndex+@PageSize
SET @strSql=' SELECT * FROM (SELECT ROW_NUMBER()
OVER(ORDER BY ' + @Sort + ') AS rownum, ' + @strFld + ' FROM ' + @tab + ' where ' + @strWhere + ') AS Dwhere
WHERE rownum BETWEEN ' + CAST(@StartIndex AS VARCHAR(30)) + ' and ' + CAST(@ENDINDEX AS VARCHAR(30))
exec (@strSql)
SET NOCOUNT OFF;
阅读(...) 评论()

我要回帖

更多关于 oracle 分页存储过程 的文章

 

随机推荐