数据库分页存储过程,支持多表联合查询

CREATE PROCEDURE [dbo].[getInQuiryAllByPage]
@tableNames   varchar(5000),   --表名,可多表,逗号分隔
@tbFields   varchar(5000)= '* ',--字段名,如果多表请带前缀
@conditionStr   varchar(5000)= ' ',   --where子句,可为空,不带where
@sortedStr   varchar(5000),   --排序字段,可多个,要带desc或asc,不带order   by,必须,不能为空
--排序字段不能有空值,或者在where中排除空值或者用isnull函数解决 

@needCount   bit   =   1,   --是否需要得到纪录总数
@pageIndex   int   =0,   --页索引
@pageSize   int=10,   --页大小
@recordCount   int   =0   output,   --返回纪录总数
@pageCount   int   =0   output   --返回页总数 

AS
BEGIN
declare   @sql   nvarchar(4000)   --主sql语句
declare   @sortStr2   varchar(8000)   --order   by子句
declare   @sortStr3   varchar(8000)   --order   by子句
declare @whereStr nvarchar(4000) --条件
declare @sortStr nvarchar(4000) --条件
set   @sortStr   =   LOWER(@sortedStr)
set   @sortStr2   =   REPLACE(@sortStr, 'desc', ' @[email protected] ')
set   @sortStr2   =   REPLACE(@sortStr2, 'asc', ' @[email protected] ')
set   @sortStr2   =   REPLACE(@sortStr2, ' @[email protected] ', ' asc ')
set   @sortStr2   =   REPLACE(@sortStr2, ' @[email protected] ', ' desc ')
--------------------------------------------------------------
set   @sortStr2 = REPLACE(@sortStr2,'a.','  ')
set   @sortStr2 = REPLACE(@sortStr2,'b.','  ')
set   @sortStr2 = REPLACE(@sortStr2,'c.','  ')
set   @sortStr2 = REPLACE(@sortStr2,'e.','  ')
set   @sortStr2 = REPLACE(@sortStr2,'f.','  ')
set   @sortStr2 = REPLACE(@sortStr2,'g.','  ')
set   @sortStr3 = @sortStr
set   @sortStr3 = REPLACE(@sortStr3,'a.','  ')
set   @sortStr3 = REPLACE(@sortStr3,'b.','  ')
set   @sortStr3 = REPLACE(@sortStr3,'c.','  ')
set   @sortStr3 = REPLACE(@sortStr3,'e.','  ')
set   @sortStr3 = REPLACE(@sortStr3,'f.','  ')
set   @sortStr3 = REPLACE(@sortStr3,'g.','  ')
--------------------------------------------------------------
set   @sortStr   =   ' order by '   +   @sortStr
set   @sortStr2   =  ' order by '   +   @sortStr2
set   @sortStr3   =  ' order by '   +   @sortStr3 

if(@conditionStr   is   not   null   and   @conditionStr   != ' '   )
set   @whereStr   =   '   where   '   +   @conditionStr
else
set   @whereStr   =   ' ' 

--if(@needCound   !=   0  or   @pageIndex   =   0 )   --以下获得纪录总数
begin
DECLARE   @R   int
SET   @sql=  'select   @R=count(*)   from   '[email protected] + @whereStr
EXEC   SP_EXECUTESQL   @SQL,N'@R   int   OUTPUT ',@R   OUTPUT
SET   @recordCount   =  @R
set   @pageCount   =   ((@recordCount-1)/@pageSize)+1
end 

if(@pageIndex <2)   --如果是第一页
begin
set   @pageIndex   =   1
set   @sql= 'select   top   '+   str(@pageSize)
      +   '   '+   @tbFields   +   '   from   '   +   @tableNames
      +   @whereStr   +   @sortStr;
end 

else   --其它页
begin
   if( @recordCount>@pageIndex*@pageSize)

	SET   @sql=   'SELECT   *   FROM   ( '
	+   'SELECT   TOP   '   +   STR(@pageSize)   +   '   *   FROM   ( '
	+   'select   top   '   +   STR(@pageSize*@pageIndex)   +   '   '+   @tbFields   +   '   FROM   '
	+   @tableNames   +   @whereStr   +   @sortStr   +   ')   as   a '
	+   @sortStr2   +   ')   as   b '   +   @sortStr3 

   else

		SET   @sql=   ' select  *   FROM   ('
        + ' SELECT   top '+  STR(@[email protected]*(@pageCount-1))
		+  '   '+   @tbFields   +   '    FROM   '
		+   @tableNames   +   @whereStr   +   @sortStr2 + ' ) AS  a'
        +   @sortStr3 

end
print @sql
EXEC   SP_EXECUTESQL   @sql
END

时间: 2024-10-15 18:35:04

数据库分页存储过程,支持多表联合查询的相关文章

SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程

  第一种:单表多字段排序分页存储过程       --支持单表多字段查询,多字段排序 create PROCEDURE [dbo].[UP_GetByPageFiledOrder] ( @TableName varchar(50), --表名 @ReFieldsStr varchar(200) = '*', --字段名(全部字段为*) @OrderString varchar(200), --排序字段(必须!支持多字段不用加order by) @WhereString varchar(500)

SharePoint 2013 列表多表联合查询

在SharePoint的企业应用中,遇到复杂的逻辑的时候,我们会需要多表查询:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,需要使用SPQuery的Joins属性来完成. 下面,我们通过一个简单的例子,为大家演示一下如何使用SPQuery通过查阅项字段来进行两个列表的联合查询. 1.首先创建测试列表,City是城市,然后有一个列表叫做Address,是地址,通过查阅项Location进行关联,CityID字段是Number类型,这里代表城市的ID号: 创

SharePoint 列表多表联合查询

在SharePoint平台二次开发中,我们有时需要涉及多表关联查询展示多列表中的不同字段信息:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,有一定的局限性,需要使用SPQuery的Joins属性来完成. 联合查询的前提条件: 1.子列表必须采用查阅项进行关联主表: 下面,我们通过一个简单的例子,为大家演示一下如何使用SPQuery通过查阅项字段来进行两个列表的联合查询. 1.创建主列表,City是城市:子列Address,是地址,子列表新增加查阅项Cit

MVC5+EF6简单实例---以原有SQLServer数据库两表联合查询为例

工具:VS.net2013.EF6.MVC5.SQLServer2008 参考出处: http://www.cnblogs.com/slark/p/mvc-5-get-started-create-project.html http://www.cnblogs.com/miro/p/4288184.html http://www.cnblogs.com/dotnetmvc/p/3732029.html 一.准备工作 在SqlServer上创建数据库:Element 模拟两个表并插入数据:SysU

获取多表联合查询的存储过程。

USE [NopV3.3Test] GO /****** Object: StoredProcedure [dbo].[GetPostList] Script Date: 06/18/2014 15:27:19 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: 于留洋 -- Create date: 2014/06

thinkphp两表,多表联合查询及分页的连贯操作写法

ThinkPHP中关联查询(即多表联合查询)可以使用 table() 方法或和join方法,具体使用如下例所示: 1.原生查询示例: 代码如下: $Model = new Model(); $sql = 'select a.id,a.title,b.content from think_test1 as a, think_test2 as b where a.id=b.id '.$map.' order by a.id '.$sort.' limit '.$p->firstRow.','.$p-

Oracle数据库-多表联合查询&amp;子查询

多表联合查询 当需要获取的数据分布在多张中,考虑使用联合查询1.SQL92方式2.SQL99方式 SQL92方式 1.笛卡尔积:将多个表的数据进行一一对应,所得到结果为多表的笛卡尔积. 结果的数量为所有表的数量的乘积. select * from emp,dept 2.等值连接筛选 概念:先做表的笛卡尔积,然后筛选,筛选条件为等值筛选. 注意:条件为字段的值相同来进行筛选,字段的名字可以不同 查询员工姓名,工作,薪资,部门名称 select * from emp,dept where emp.d

Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新

CrmFetchKit.js是一个跨浏览器的一个类库,允许通过JavaScript来执行fetch xml的查询,还可以实现批量更新,分页查询等.目前已支持Chrome 25, Firefox 19 和 IE9/10 . 它的最大优势是可以通过fetchxml 来查询,这样我们就可以实现真正的多表联合查询,虽然可以用OData终结点的$expand来进行多表的联合查询,但这种方式没办法过滤多表的条件,它只能过滤主表的条件. 下面来看下简单的多表查询的例子: 1.首先定义一个fetchxml: 1

sql server 2000 单主键高效分页存储过程 (支持多字段排序)

sql server 2000 单主键高效分页存储过程 (支持多字段排序) Create PROC P_viewPage             /*              nzperfect [no_mIss] 高效通用分页存储过程(双向检索) 2007.5.7  QQ:34813284              敬告:适用于单一主键或存在唯一值列的表或视图              ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围