当前位置: 代码迷 >> Sql Server >> 求SQL2005通用的高效率分页存储过程(要支持UNION和into #a1之类的)
  详细解决方案

求SQL2005通用的高效率分页存储过程(要支持UNION和into #a1之类的)

热度:103   发布时间:2016-04-27 11:25:18.0
求SQL2005通用的高效分页存储过程(要支持UNION和into #a1之类的)
在网上找了很多分页存储过程,都没有可以支持union的(即两句select组合查询),如果能够支持into #a1这类的就更好了,这样就可以用update #a1 set ....来进行子查询,简单明了。

------解决方案--------------------
参考:
SQL code
http://topic.csdn.net/u/20100203/17/8F916471-597D-481A-B170-83BCEFE3B199.html应一个朋友的要求,贴上收藏的SQL常用分页的办法~~ 表中主键必须为标识列,[ID] int IDENTITY (1,1) 1.分页方案一:(利用Not In和SELECT TOP分页) 语句形式:  SELECT TOP 页记录数量 * FROM 表名 WHERE (ID NOT IN   (SELECT TOP (每页行数*(页数-1)) ID   FROM 表名   ORDER BY ID))   ORDER BY ID //自己还可以加上一些查询条件 例: select top 2 * from Sys_Material_Type where (MT_ID not in     (select top (2*(3-1)) MT_ID from Sys_Material_Type  order by MT_ID)) order by MT_ID 2.分页方案二:(利用ID大于多少和SELECT TOP分页) 语句形式: SELECT TOP 每页记录数量 * FROM 表名 WHERE (ID >           (SELECT MAX(id)     FROM (SELECT TOP 每页行数*页数 id  FROM 表           ORDER BY id) AS T)       ) ORDER BY ID 例: SELECT TOP 2 * FROM Sys_Material_Type WHERE (MT_ID >           (SELECT MAX(MT_ID)           FROM (SELECT TOP (2*(3-1)) MT_ID                 FROM Sys_Material_Type                 ORDER BY MT_ID) AS T)) ORDER BY MT_ID 3.分页方案三:(利用SQL的游标存储过程分页) create  procedure SqlPager @sqlstr nvarchar(4000), --查询字符串 @currentpage int, --第N页 @pagesize int --每页行数 as set nocount on declare @P1 int, --P1是游标的id @rowcount int exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @[email protected] output select ceiling([email protected][email protected]) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 set @currentpage=(@currentpage-1)[email protected]+1 exec sp_cursorfetch @P1,16,@currentpage,@pagesize exec sp_cursorclose @P1 set nocount off 4.总结: 其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。 建议优化的时候,加上主键和索引,查询效率会提高。 通过SQL 查询分析器,显示比较:我的结论是: 分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句 分页方案一:(利用Not In和SELECT TOP分页)  效率次之,需要拼接SQL语句 分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用
------解决方案--------------------
还有这个:

SQL code
SQL 2005的ROW_NUMBER()实现分页功能DECLARE @pagenum AS INT, @pagesize AS INTSET @pagenum = 2SET @pagesize = 3SELECT *FROM (SELECT ROW_NUMBER() OVER(ORDER BY newsid DESC) AS rownum,         newsid, topic, ntime, hits      FROM news) AS DWHERE rownum BETWEEN (@pagenum-1)[email protected]+1 AND @[email protected]ORDER BY newsid DESC aspx里面只需给SQL传入pageid和条数即可。 CSDN上还有个存储过程实现分页的代码: ALTER PROCEDURE news_Showlist(@tblName   varchar(255),       -- 表名@strGetFields varchar(1000),  -- 需要返回的列@fldName varchar(255),      -- 排序的字段名@PageSize   int ,          -- 页尺寸@PageIndex  int ,           -- 页码@strWhere  varchar(1500),  -- 查询条件(注意: 不要加where)@Sort varchar(255)      --排序的方法)ASdeclare @strSQL   varchar(5000)       -- 主语句declare @strTmp   varchar(110)        -- 临时变量declare @strOrder varchar(400)        -- 排序类型if @Sort = 'desc'beginset @strTmp = '<(select min'set @strOrder = ' order by ' + @fldName +' desc'[email protected],就执行降序,这句很重要!endelsebeginset @strTmp = '>(select max'set @strOrder = ' order by ' + @fldName +' asc'end if @PageIndex = 1beginif @strWhere != ''     beginset @strSQL = 'select top ' + str(@PageSize) +' [email protected]+ '  from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder  endelse  beginset @strSQL = 'select top ' + str(@PageSize) +' [email protected]+ '  from '+ @tblName + ' '+ @strOrder  end--如果是第一页就执行以上代码,这样会加快执行速度endelsebegin[email protected]set @strSQL = 'select top ' + str(@PageSize) +' [email protected]+ '  from '+ @tblName + ' where ' + @fldName + '' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)[email protected]) + ' '+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'+ @strOrder if @strWhere != ''set @strSQL = 'select top ' + str(@PageSize) +' [email protected]+ '  from '+ @tblName + ' where ' + @fldName + '' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)[email protected]) + ' '+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrderendexec (@strSQL)RETURN
  相关解决方案