### SQL多表分页存储过程解析 #### 标题与描述概述 该存储过程主要针对SQL Server 2005/2000环境下的多表分页查询进行了实现,并且已在SQL环境下测试通过。其核心功能是为用户提供一种灵活且高效的多表分页查询方式,适用于需要对大量数据进行快速分页显示的应用场景。 #### 存储过程参数详解 存储过程中定义了一系列输入参数和输出参数,用于控制和返回分页查询的结果。 - **@tblName**: 表名,必填参数。 - **@fldName**: 查询字段列表,默认为`'*'`表示查询所有字段。 - **@pageSize**: 每页显示记录数,默认值为10。 - **@page**: 当前页码,默认值为1。 - **@fldSort**: 排序字段,默认为`NULL`表示不排序。 - **@Sort**: 排序方式,1为升序,0为降序,默认为0(降序)。 - **@strCondition**: 查询条件,默认为`NULL`。 - **@ID**: 用于唯一标识记录的字段,默认为空字符串。 - **@Dist**: 是否使用`DISTINCT`去重,默认为0(不使用)。 - **@pageCount**: 输出参数,返回总页数。 - **@Counts**: 输出参数,返回总记录数。 #### 存储过程逻辑分析 1. **初始化SQL关键字**: - 根据`@Dist`参数决定是否使用`DISTINCT`关键字进行去重。 - 根据`@Sort`参数设置排序方式为升序或降序。 2. **构建基础查询语句**: - 如果`@strCondition`为空,则直接构造基础查询语句。 - 如果`@strCondition`不为空,则在基础查询语句中添加WHERE子句。 3. **执行查询以获取总记录数**: - 使用`sp_executesql`动态执行SQL语句,获取满足条件的总记录数,并将结果赋值给`@Counts`。 4. **计算总页数**: - 根据总记录数`@Counts`和每页显示数量`@pageSize`计算总页数`@pageCount`。 - 如果当前页码`@page`超过总页数,则将当前页设为总页数。 5. **构建最终分页查询语句**: - 根据当前页码、每页显示数量以及排序字段等参数,构造最终的分页查询SQL语句。 6. **执行分页查询**: - 动态执行最终分页查询语句,返回指定页码的数据。 #### 核心代码解析 ```sql CREATE PROCEDURE proc_DataPagination ( @tblName nvarchar(200), @fldName nvarchar(500) = '*', @pageSize int = 10, @page int = 1, @fldSort nvarchar(200) = NULL, @Sort bit = 0, @strCondition nvarchar(1000) = NULL, @ID nvarchar(150), @Dist bit = 0, @pageCount int OUTPUT, @Counts int OUTPUT ) AS SET NOCOUNT ON ... ``` 1. **SQL关键字初始化**:根据`@Dist`参数来判断是否使用`DISTINCT`,并根据`@Sort`参数设置排序方式。 2. **基础查询语句构建**:根据`@strCondition`是否为空来决定基础查询语句中是否包含WHERE子句。 3. **执行查询以获取总记录数**:通过`sp_executesql`动态执行SQL语句来获取总记录数。 4. **计算总页数**:根据总记录数和每页显示数量计算总页数,并处理当前页码超出总页数的情况。 5. **构建分页查询语句**:构建包含分页条件的查询语句。 6. **执行分页查询**:执行分页查询语句,返回分页后的数据。 #### 结论 该存储过程通过一系列参数配置,实现了灵活的分页查询功能,能够适应不同的查询需求。通过对存储过程的逻辑分析,我们可以看出它充分考虑了性能优化的需求,例如通过先查询总记录数再进行分页查询的方式避免了不必要的数据加载,提高了查询效率。此外,通过参数化的设置也增加了查询的灵活性和通用性。
(
@tblName nvarchar(200), ----要显示的表或多个表的连接
@fldName nvarchar(500) = '*', ----要显示的字段列表
@pageSize int = 10, ----每页显示的记录个数
@page int = 1, ----要显示那一页的记录
@fldSort nvarchar(200) = null, ----排序字段列表或条件
@Sort bit = 0, ----排序方法,1为升序,0为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
@strCondition nvarchar(1000) = null, ----查询条件,不需where
@ID nvarchar(150), ----主表的主键
@Dist bit = 0, ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
@pageCount int = 1 output, ----查询结果分页后的总页数
@Counts int = 1 output ----查询到的记录数
)
AS
SET NOCOUNT ON
Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句
Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句
Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句
Declare @strSortType nvarchar(10) ----数据排序规则A
Declare @strFSortType nvarchar(10) ----数据排序规则B
Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造
Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造
if @Dist = 0
begin
set @SqlSelect = 'select '
end
else
begin
set @SqlSelect = 'select distinct '
set @SqlCounts = 'Count(DISTINCT '+@ID+')'
end
if @Sort=0
begin
set @strFSortType=' DESC '
set @strSortType=' DESC '
end
else
begin
set @strFSortType=' ASC '
set @strSortType=' ASC '
end
if(@fldSort is not null and @fldSort<>'')
begin
set @fldSort=','+@fldSort
end
else
begin
set @fldSort=' '
end
--------生成查询语句--------
剩余6页未读,继续阅读
- 粉丝: 37
- 资源: 771
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助