------------------------------------------------------------------------- -- 名称(Name):GetRecordFromTableWithSimpleJoinByPage -- 功能(Function):分页获得多表连接查询的数据 -- 书写者(Author): -- 日期(Date):2006年02月15日 -- 输入参数: /* @tblName nvarchar(255), -- 表名 @priKeyName nvarchar(50), -- 主键列 @fldNames nvarchar(1000), -- 要取值的字段名,多个字段通过逗号分割 @PageSize int = 0, -- 页尺寸,0表示不需要分页 @PageIndex int = 1, -- 页码,从1开始 @OrderType nvarchar(200) = '', -- 设置排序,'':没有排序要求 0:主键升序 1:主键降序 else:用户自定义排序规则 @strWhere nvarchar(2000) = '', -- 查询条件 (注意: 不要加 where) @strJoin nvarchar(1000) = '', -- 连接表 */ --输出参数: -- @TotalItem int output, -- 总的记录数 -- @TotalPage int output -- 总的页数 -- 说明: -- (1) 当多个表简单的连接时,可以使用该存储过程 -- (2) 需要注意的是多个表参与查询时,要查询的字段最好附带表名, -- (3) 排序规则要建立在主表上 -- (4) 适用于使用左外连接,这样连接的表不参与建立排序 ------------------------------------------------------------------------- -- 修改者: -- 修改日期: -- 修改说明: ------------------------------------------------------------------------- ALTER PROCEDURE [dbo].[GetRecordFromTableWithSimpleLeftOuterJoinByPage] @tblName nvarchar(255), -- 表名 @priKeyName nvarchar(50), -- 主键列或标示列 @fldNames nvarchar(1000), -- 字段名,多个字段通过逗号分割 @totalflds nvarchar(500), @PageSize int, -- 页尺寸 @PageIndex int, -- 页码 @OrderType nvarchar(200), -- 设置排序,'':没有排序要求 0:主键升序 1:主键降序 字符串:用户自定义排序规则 @strWhere nvarchar(2000), -- 查询条件 (注意: 不要加 where) @strJoin nvarchar(1000), -- 连接表 @TotalItem int output, @TotalPage int output AS declare @strByPage nvarchar(4000) -- 分页查询语句 declare @strNoPage nvarchar(1500) -- 不分页查询语句,获得所有符合条件的记录 declare @strTotal nvarchar(1000) -- 统计符合条件的纪录数 declare @strNonResult nvarchar(1500) -- 返回空记录的语句 declare @strTmp nvarchar(100) declare @strOrder nvarchar(200) declare @strSql nvarchar(4000) if @OrderType is null or @OrderType='' begin set @strOrder = '' set @strTmp='' end else if @OrderType = '0' -- 降序 begin set @strTmp = @tblName + '.' + @priKeyName + '>(select max([' + @priKeyName + ']) from ' set @strOrder = ' order by ' + @tblName + '.' + @priKeyName + ' asc' end else if @OrderType = '1' -- 降序 begin set @strTmp = @tblName + '.' + @priKeyName + '<(select min([' + @priKeyName + ']) from ' set @strOrder = ' order by ' + @tblName + '.' + @priKeyName + ' desc' end else -- 用户自定义排序规则 begin set @strTmp = '' set @strOrder = ' order by ' + @OrderType end set @strJoin = ' ' + @strJoin + ' ' set @strNonResult = 'select ' + @fldNames + ' from ' + @tblName + @strJoin + ' where 1=2' if @strWhere is null or @strWhere = '' -- 如果没有额外的查询条件 begin set @strTotal = N'select @TotalItem = count(*) from ' + @tblname + @strJoin set @strNoPage = N'select ' + @fldNames + ' from ' + @tblName + @strJoin + @strOrder end else begin set @strTotal = N'select @TotalItem = count(*) from ' + @tblname + @strJoin + ' where ' + @strWhere set @strNoPage = N'select ' + @fldNames + ' from ' + @tblName + @strJoin + ' where ' + @strWhere + @strOrder end -- 取得所有符合查询条件的记录数 --print @strTotal exec sp_executeSql @strTotal,N'@TotalItem int output',@TotalItem output -- 如果没有适合条件的记录时,提供一个空的记录集并退出查询 if @TotalItem = 0 begin set @TotalPage = 0 set @strSql = @strNonResult --exec sp_executeSql @strNonResult end else begin -- 执行查询,此时记录集不为空 if @PageSize = 0 -- 当不需要分页时 begin --set nocount off set @TotalPage = 0 set @strSql = @strNoPage --exec sp_executeSql @strNoPage end else -- 当需要分页时 begin --set nocount off -- 得到记录的页数,并调整页号,分页从1开始 set @TotalPage=CEILING(cast(@TotalItem as float)/@PageSize) if(@PageIndex>@TotalPage) set @PageIndex=@TotalPage if(@PageIndex <1) set @PageIndex=1 if @PageIndex =1 -- 如果是第一页 begin if @strWhere='' begin set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldNames + ' from ' + @tblName + @strJoin + @strOrder end else begin set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldNames + ' from ' + @tblName + @strJoin + ' where ' + @strWhere + @strOrder end end else -- 以后页 begin if (@OrderType='0' or @OrderType='1') -- 按主键升序或降序 begin if @strWhere='' set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldnames + ' from ' + @tblName + @strJoin + ' where ' + @strTmp + ' (select top ' + cast((@PageIndex-1) * @PageSize as varchar) + ' ' + @priKeyName + ' from ' + @tblName + @strJoin + @strOrder + ') as tmptbl)' + @strOrder else set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldnames + ' from ' + @tblName + @strJoin + ' where ' + @strTmp + ' (select top '+ cast((@PageIndex-1) * @PageSize as varchar) + ' ' + @priKeyName + ' from ' + @tblName + @strJoin + ' where ' + @strWhere + @strOrder + ') as tmptbl)' + ' and ' + @strWhere + @strOrder end else -- 没有排序规则或者用户自定义规则 begin if @strWhere='' set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldnames + ' from ' + @tblName + @strJoin + ' where not exists (select * from ' + ' (select top ' + cast((@PageIndex-1) * @PageSize as varchar) + @tblName + '.'+ @prikeyName + ' from ' + @tblName + @strJoin + @strorder + ') as tmpTable ' + ' where tmpTable.' + @priKeyName + ' = ' + @tblName +'.' + @priKeyName + ')' + @strorder else set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldnames + ' from ' + @tblName + @strJoin + ' where not exists (select * from ' + ' (select top ' + cast((@PageIndex-1) * @PageSize as varchar) + @tblName + '.'+ @prikeyName + ' from ' + @tblName + @strJoin + ' where ' + @strWhere + @strorder + ') as tmpTable ' + ' where tmpTable.' + @priKeyName + ' = ' + @tblName + '.' + @priKeyName + ')' + ' and ' + @strWhere + @strorder end end end set @strSql = @strByPage -- exec sp_executeSql @strByPage end --print @strSql exec sp_executeSql @strSql if @totalflds is not null and @totalflds !='' begin declare @strTotalfld nvarchar(2000) if (@strWhere is null or @strWhere='') begin set @strTotalfld = 'select ' + @totalflds + ' from ' + @tblName end else begin set @strTotalfld = 'select ' + @totalflds + ' from ' + @tblName + ' where ' + @strWhere end exec sp_executeSql @strTotalfld end return