设为首页 收藏本站
查看: 834|回复: 0

[经验分享] sql server分页存储过程

[复制链接]

尚未签到

发表于 2018-10-15 07:28:32 | 显示全部楼层 |阅读模式
  利用表变量实现分页
  一、
  


  • 代码

  • CREATE PROCEDURE [dbo].[GetRecordFromPage]
  •     @SelectList            VARCHAR(2000),    --欲选择字段列表
  •     @TableSource        VARCHAR(100),    --表名或视图表
  •     @SearchCondition    VARCHAR(2000),    --查询条件
  •     @OrderExpression    VARCHAR(1000),    --排序表达式
  •     @PageIndex            INT = 1,        --页号,从0开始
  •     @PageSize            INT = 10        --页尺寸
  • AS
  • BEGIN
  •     IF @SelectList IS NULL OR LTRIM(RTRIM(@SelectList)) = ''
  •     BEGIN
  •         SET @SelectList = '*'
  •     END
  •     PRINT @SelectList

  •     SET @SearchCondition = ISNULL(@SearchCondition,'')
  •     SET @SearchCondition = LTRIM(RTRIM(@SearchCondition))
  •     IF @SearchCondition  ''
  •     BEGIN
  •         IF UPPER(SUBSTRING(@SearchCondition,1,5))  'WHERE'
  •         BEGIN
  •             SET @SearchCondition = 'WHERE ' + @SearchCondition
  •         END
  •     END
  •     PRINT @SearchCondition

  •     SET @OrderExpression = ISNULL(@OrderExpression,'')
  •     SET @OrderExpression = LTRIM(RTRIM(@OrderExpression))
  •     IF @OrderExpression  ''
  •     BEGIN
  •         IF UPPER(SUBSTRING(@OrderExpression,1,5))  'WHERE'
  •         BEGIN
  •             SET @OrderExpression = 'ORDER BY ' + @OrderExpression
  •         END
  •     END
  •     PRINT @OrderExpression

  •     IF @PageIndex IS NULL OR @PageIndex < 1
  •     BEGIN
  •         SET @PageIndex = 1
  •     END
  •     PRINT @PageIndex
  •     IF @PageSize IS NULL OR @PageSize < 1
  •     BEGIN
  •         SET @PageSize = 10
  •     END
  •     PRINT  @PageSize

  •     DECLARE @SqlQuery VARCHAR(4000)

  •     SET @SqlQuery='SELECT '+@SelectList+',RowNumber
  •     FROM
  •         (SELECT ' + @SelectList + ',ROW_NUMBER() OVER( '+ @OrderExpression +') AS RowNumber
  •           FROM '+@TableSource+' '+ @SearchCondition +') AS RowNumberTableSource
  •     WHERE RowNumber BETWEEN ' + CAST(((@PageIndex - 1)* @PageSize+1) AS VARCHAR)
  •     + ' AND ' +
  •     CAST((@PageIndex * @PageSize) AS VARCHAR)
  •     PRINT @SqlQuery
  •     SET NOCOUNT ON
  •     EXECUTE(@SqlQuery)
  •     SET NOCOUNT OFF

  •     RETURN @@RowCount
  • END
  

  二
  


  • 代码

  • CREATE PROCEDURE [dbo].[GetRecordFromPage]
  •     @SelectList            VARCHAR(2000),    --欲选择字段列表
  •     @TableSource        VARCHAR(100),    --表名或视图表
  •     @SearchCondition    VARCHAR(2000),    --查询条件
  •     @OrderExpression    VARCHAR(1000),    --排序表达式
  •     @PageIndex            INT = 1,        --页号,从0开始
  •     @PageSize            INT = 10        --页尺寸
  • AS
  • BEGIN
  •     IF @SelectList IS NULL OR LTRIM(RTRIM(@SelectList)) = ''
  •     BEGIN
  •         SET @SelectList = '*'
  •     END
  •     PRINT @SelectList

  •     SET @SearchCondition = ISNULL(@SearchCondition,'')
  •     SET @SearchCondition = LTRIM(RTRIM(@SearchCondition))
  •     IF @SearchCondition  ''
  •     BEGIN
  •         IF UPPER(SUBSTRING(@SearchCondition,1,5))  'WHERE'
  •         BEGIN
  •             SET @SearchCondition = 'WHERE ' + @SearchCondition
  •         END
  •     END
  •     PRINT @SearchCondition

  •     SET @OrderExpression = ISNULL(@OrderExpression,'')
  •     SET @OrderExpression = LTRIM(RTRIM(@OrderExpression))
  •     IF @OrderExpression  ''
  •     BEGIN
  •         IF UPPER(SUBSTRING(@OrderExpression,1,5))  'WHERE'
  •         BEGIN
  •             SET @OrderExpression = 'ORDER BY ' + @OrderExpression
  •         END
  •     END
  •     PRINT @OrderExpression

  •     IF @PageIndex IS NULL OR @PageIndex < 1
  •     BEGIN
  •         SET @PageIndex = 1
  •     END
  •     PRINT @PageIndex
  •     IF @PageSize IS NULL OR @PageSize < 1
  •     BEGIN
  •         SET @PageSize = 10
  •     END
  •     PRINT  @PageSize

  •     DECLARE @SqlQuery VARCHAR(4000)

  •     SET @SqlQuery='SELECT '+@SelectList+',RowNumber
  •     FROM
  •         (SELECT ' + @SelectList + ',ROW_NUMBER() OVER( '+ @OrderExpression +') AS RowNumber
  •           FROM '+@TableSource+' '+ @SearchCondition +') AS RowNumberTableSource
  •     WHERE RowNumber BETWEEN ' + CAST(((@PageIndex - 1)* @PageSize+1) AS VARCHAR)
  •     + ' AND ' +
  •     CAST((@PageIndex * @PageSize) AS VARCHAR)
  •     PRINT @SqlQuery
  •     SET NOCOUNT ON
  •     EXECUTE(@SqlQuery)
  •     SET NOCOUNT OFF

  •     RETURN @@RowCount
  • END
  

  三、
  从数据表中取出第n条到第m条的记录的方法
  从publish 表中取出第 n 条到第 m 条的记录:
  SELECT TOP m-n+1 *
  FROM publish
  WHERE (id NOT IN

  (SELECT TOP n-1>  FROM publish))
  id 为publish 表的关键字
  ------------------------
  分页方案:
  select top 页大小 *
  from table1

  where>  (select max (id) from

  (select top ((页码-1)*页大小)>  )

  order by>  全部的sql语句:
  


  • 代码

  • --获取指定页的数据:
  • CREATE PROCEDURE pagination3
  • @tblName varchar(255), -- 表名
  • @strGetFields varchar(1000) = ''*'', -- 需要返回的列
  • @fldName varchar(255)='''', -- 排序的字段名
  • @PageSize int = 10, -- 页尺寸
  • @PageIndex int = 1, -- 页码
  • @doCount bit = 0, -- 返回记录总数, 非 0 值则返回
  • @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
  • @strWhere varchar(1500) = '''' -- 查询条件 (注意: 不要加 where)
  • AS

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

  • if @doCount != 0
  • begin
  • if @strWhere !=''''
  • set @strSQL = &quot;select count(*) as Total from [&quot; + @tblName + &quot;] where &quot;+@strWhere
  • else
  • set @strSQL = &quot;select count(*) as Total from [&quot; + @tblName + &quot;]&quot;
  • end
  • --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况:
  • else
  • begin
  • if @OrderType != 0
  • begin
  • set @strTmp = &quot;(select max&quot;
  • set @strOrder = &quot; order by [&quot; + @fldName +&quot;] asc&quot;
  • end

  • if @PageIndex = 1
  • begin
  • if @strWhere != ''''

  • set @strSQL = &quot;select top &quot; + str(@PageSize) +&quot; &quot;+@strGetFields+ &quot;
  •         from [&quot; + @tblName + &quot;] where &quot; + @strWhere + &quot; &quot; + @strOrder
  • else

  • set @strSQL = &quot;select top &quot; + str(@PageSize) +&quot; &quot;+@strGetFields+ &quot;
  •         from [&quot;+ @tblName + &quot;] &quot;+ @strOrder
  • --如果是第一页就执行以上代码,这样会加快执行速度
  • end
  • else
  • begin
  • --以下代码赋予了@strSQL以真正执行的SQL代码
  •  
  • set @strSQL = &quot;select top &quot; + str(@PageSize) +&quot; &quot;+@strGetFields+ &quot; from [&quot;
  • + @tblName + &quot;] where [&quot; + @fldName + &quot;]&quot; + @strTmp + &quot;([&quot;+ @fldName + &quot;])
  •       from (select top &quot; + str((@PageIndex-1)*@PageSize) + &quot; [&quot;+ @fldName + &quot;]
  •       from [&quot; + @tblName + &quot;]&quot; + @strOrder + &quot;) as tblTmp)&quot;+ @strOrder

  • if @strWhere != ''''
  • set @strSQL = &quot;select top &quot; + str(@PageSize) +&quot; &quot;+@strGetFields+ &quot; from [&quot;
  • + @tblName + &quot;] where [&quot; + @fldName + &quot;]&quot; + @strTmp + &quot;([&quot;
  • + @fldName + &quot;]) from (select top &quot; + str((@PageIndex-1)*@PageSize) + &quot; [&quot;
  • + @fldName + &quot;] from [&quot; + @tblName + &quot;] where &quot; + @strWhere + &quot; &quot;
  • + @strOrder + &quot;) as tblTmp) and &quot; + @strWhere + &quot; &quot; + @strOrder
  • end

  • end

  • exec (@strSQL)

  • GO
  




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-621663-1-1.html 上篇帖子: SQL Server 数据库简介 下篇帖子: Sql Server 2000 event_id=9003
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表