Loading

分页sql存储过程

01set ANSI_NULLS ON
02set QUOTED_IDENTIFIER ON
03go
04 
05/*
06功能描述: 通用分页显示查询
07如果有自增标识字段,在@strGetFields中不要加入此字 段信息,
08如果非要加入的话,要 (fldName + 0) AS fldName 这样处理;
09输入参数:
10@tblName: 表名
11@strGetFields: 需要返回的列 '*':返回所以列信息
12@PageSize: 页尺寸
13@PageIndex: 页码
14@doCount: 返回记录总数, 非 0 值则返回
15@strOrderBy: 排序字段信息,(注意: 不要加 ORDER BY)
16格式: Field1 DESC, Field2 ASC
17@strWhere: 查询条件,(注意: 不要加 WHERE)
18输出参数: @RecordCount: 记录总数
19作 者: Nestcn
20创建时间: 2010-03-09
21更改纪录:
22*/
23ALTER PROCEDURE [dbo].[MyPagination]
24(
25@tblName varchar(255),
26@strGetFields varchar(1000) = '*',
27@PageSize int = 10,
28@PageIndex int = 1,
29@doCount bit = 0,
30@strOrderBy varchar(500) = '',
31@strWhere varchar(1500) = '',
32@RecordCount int output
33)
34AS
35-- 主语句
36DECLARE @strSQL varchar(5000) SET @strSQL = ''
37-- 排序变量
38DECLARE @strOrder varchar(400) SET @strOrder = ''
39 
40SET @RecordCount = 0
41--如果@doCount传递过来的不是0,就执行总数统计
42IF (@doCount != 0)
43BEGIN
44DECLARE @sWhere varchar(2000)
45 
46SET @sWhere = ''
47IF (@strWhere != '')
48SET @sWhere = ' WHERE ' + @strWhere
49 
50SET @strSQL = 'if exists (select * from dbo.sysobjects where id = object_id(''[dbo].[tmpTable]'') and OBJECTPROPERTY(id, ''IsUserTable'') = 1) '
51SET @strSQL = @strSQL + ' UPDATE tmpTable SET Total = (SELECT COUNT(*) FROM [' + @tblName + '] ' + @sWhere + ') '
52SET @strSQL = @strSQL + ' ELSE SELECT COUNT(*) AS Total INTO tmpTable FROM [' + @tblName + '] ' + @sWhere
53 
54EXEC (@strSQL)
55 
56SELECT @RecordCount=Total FROM tmpTable
57 
58--删除总数统计临时表
59EXEC ('DROP TABLE tmpTable')
60END
61 
62PRINT @RecordCount
63 
64--排序字段信息
65IF (@strOrderBy != '')
66SET @strOrder = ' ORDER BY ' + @strOrderBy
67--如果是第一页就执行以上代码,这样会加快执行速度
68IF (@PageIndex = 1)
69BEGIN
70IF (@strWhere != '')
71SET @strSQL = 'SELECT TOP ' + str(@PageSize) + ' ' + @strGetFields + ' FROM [' + @tblName + '] WHERE ' + @strWhere + @strOrder
72ELSE
73SET @strSQL = 'SELECT TOP ' + str(@PageSize) + ' ' + @strGetFields + ' FROM ['+ @tblName + '] '+ @strOrder
74END
75ELSE
76BEGIN
77--为搜索表建立自动编号 保存到临时表中
78SET @strSQL = 'SELECT TOP ' + str(@PageIndex*@PageSize) + ' IDENTITY(int,1,1) AS IID, ' + @strGetFields + ' INTO #tmpTable FROM [' + @tblName + ']'
79IF (@strWhere != '')
80SET @strSQL = @strSQL + ' WHERE ' + @strWhere + @strOrder
81ELSE
82SET @strSQL = @strSQL + @strOrder
83 
84--以下代码赋予了@strSQL以真正执行的SQL代码
85SET @strSQL = @strSQL + ' SELECT ' + @strGetFields + ' FROM #tmpTable WHERE IID > ' + str((@PageIndex-1)*@PageSize) + ' DROP TABLE #tmpTable'
86END
87 
88PRINT @strSQL
89 
90--执行分页查询
91EXEC (@strSQL)
posted @ 2010-03-09 15:54  today4king  阅读(190)  评论(0编辑  收藏  举报