设为首页 加入收藏

TOP

分页存储过程实例剖析心得 (二)
2014-11-23 20:12:01 来源: 作者: 【 】 浏览:41
Tags:存储 过程 实例 剖析 心得
。本地临时表需要注意实际删除的时间。
这里说得简单一点:当在用EXEC(@strSQL3) 创建临时表的时候,同时已经删除了临时表。因为EXEC这个过程的会话已经结束,临时表就被删除了。
这里有一篇博文做了更具体的解释,大家可以参考:点滴在心头_SQL临时表
3.思路二
上面的思路似乎行不通,那不如再换个思路,干脆不要建立临时表,用Select * from (select * from table) as temptable 这种思路代替创建临时表。
代码如下:

1 ALTER PROCEDURE [dbo].[sp_Sql_Paging]
2 (
3 @SqlDataTable NVARCHAR(4000), -- 表名
4 @PrimaryKey NVARCHAR(4000), -- 主键名称
5 @Fields NVARCHAR(4000), -- 要返回的字段
6 @pageSize INT, -- 页尺寸
7 @pageIndex INT, -- 页码
8 @recordCount INT OUTPUT, -- 记录总数
9 @strOrderBy NVARCHAR(4000), -- 排序
10 @strWhere NVARCHAR(4000) -- 查询条件
11 )
12 AS
13 BEGIN
14 SET NOCOUNT ON
15 DECLARE @strSQL1 NVARCHAR(4000) -- SQL语句1
16 DECLARE @strSQL2 NVARCHAR(4000) -- SQL语句2
17 DECLARE @strSQL3 NVARCHAR(4000) -- SQL语句3
18
19 SET @strSQL1 = 'SELECT ' + @PrimaryKey + ', ROW_NUMBER() OVER (' + @strOrderBy + ') AS RowNumber FROM ' + @SqlDataTable + ' ' + @strWhere
20
21 --获取总记录数
22 SET @strSQL3 = 'SELECT @recordCount = COUNT(*) FROM ' + @SqlDataTable + ' ' + @strWhere
23 EXEC SP_EXECUTESQL
24 @stmt = @strSQL3,
25 @params = N'@recordCount AS INT OUTPUT',
26 @recordCount = @recordCount OUTPUT
27
28 --分页查询
29 IF @pageIndex > @recordCount * 1.0 / @pageSize + 1.0 OR @recordCount <= @pageSize
30 BEGIN
31 SET @pageIndex = 1
32 END
33 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
34 EXEC SP_EXECUTESQL @strSQL2
35 END
这里有个小知识点,注意EXEC SP_EXECUTESQL的写法以及和EXEC(@strsql)的区别。大家可以去找资料了解下。
关于分页的一些事就写到这了,仅供参考。
-------------------------------------------欢迎大家指摘--------------------------------------------------------------

作者:WILLPAN

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇PostgreSQL启动过程中的那些事一.. 下一篇SQl语句查存储过程\触发器\约束(..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: