分页存储过程实例剖析心得

发表于:2011-10-13 10:12

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:WILLPAN    来源:51Testing软件测试网采编

  很显然我们得到了所需要的临时表。这时我很开心,因为得到了我想要的东西。但似乎还没有结束,我要执行下该存储过程。

  坏结果往往在这时出现:

  这里就出现奇怪的事了,按打印出来的明明是正确的创建临时表语句,而且也执行了,为什么接下来对临时表的操作又是无效的了?

  找资料问同事,终于明白,原来临时表分本地临时表和全局临时表。本地临时表需要注意实际删除的时间。

  这里说得简单一点:当在用EXEC(@strSQL3) 创建临时表的时候,同时已经删除了临时表。因为EXEC这个过程的会话已经结束,临时表就被删除了。

  3、思路二

  上面的思路似乎行不通,那不如再换个思路,干脆不要建立临时表,用Select * from (select * from table) as temptable 这种思路代替创建临时表。

  代码如下:

  • ALTER PROCEDURE [dbo].[sp_Sql_Paging] 
  •     @SqlDataTable        NVARCHAR(4000),        -- 表名 
  •     @PrimaryKey            NVARCHAR(4000),        -- 主键名称 
  •     @Fields                NVARCHAR(4000),        -- 要返回的字段 
  •     @pageSize            INT,                -- 页尺寸 
  •     @pageIndex            INT,                -- 页码 
  •     @recordCount        INT    OUTPUT,            -- 记录总数 
  •     @strOrderBy            NVARCHAR(4000),        -- 排序 
  •     @strWhere            NVARCHAR(4000)        -- 查询条件 
  • AS 
  • BEGIN 
  •     SET NOCOUNT ON 
  •     DECLARE @strSQL1    NVARCHAR(4000)        -- SQL语句1 
  •     DECLARE @strSQL2    NVARCHAR(4000)        -- SQL语句2 
  •     DECLARE @strSQL3    NVARCHAR(4000)        -- SQL语句3 
  •     SET @strSQL1 = 'SELECT ' + @PrimaryKey + ', ROW_NUMBER() OVER (' + @strOrderBy +  ') AS RowNumber FROM ' + @SqlDataTable + ' ' + @strWhere  
  •      
  •     --获取总记录数 
  •     SET @strSQL3 = 'SELECT @recordCount = COUNT(*) FROM ' + @SqlDataTable + ' ' + @strWhere 
  •     EXEC SP_EXECUTESQL  
  •             @stmt = @strSQL3, 
  •             @params = N'@recordCount AS INT OUTPUT'
  •             @recordCount = @recordCount OUTPUT 
  •     --分页查询 
  •     IF @pageIndex > @recordCount * 1.0 / @pageSize + 1.0 OR @recordCount <= @pageSize 
  •         BEGIN 
  •             SET @pageIndex = 1 
  •         END 
  •     SET @strSQL2 = 'SELECT ' + @Fields + ' FROM ' + @SqlDataTable + ' WHERE ' + @PrimaryKey + ' IN (SELECT '+@PrimaryKey+' FROM ('+@strSQL1+') TempTable WHERE RowNumber BETWEEN ' + Str((@pageIndex - 1) * @pageSize + 1) + ' AND ' + Str(@pageIndex * @pageSize) + ') ' + @strOrderBy 
  •     EXEC SP_EXECUTESQL @strSQL2 
  • END
  •   这里有个小知识点,注意EXEC SP_EXECUTESQL的写法以及和EXEC(@strsql)的区别。大家可以去找资料了解下。

      关于分页的一些事就写到这了,仅供参考。

    22/2<12
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号