set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go /*
支持多表查询分页存储过程(事理改进)2012.3
--多表联查1
declare @Count int
exec [proc_DataPagination] 'SL_Article a,SL_User u','u.RealName,a.*','a.UserId=u.UserId','',1,20,0,@Count output
select @Count
--多表联查2
declare @Count int
exec proc_DataPagination 'SL_LANAndWANPermissionLog l left join SL_Plate p on l.PlateId=p.PlateId left join SL_Admin a on l.AddUserId=a.UserId','l.*,p.PlateName,a.RealName as AddUserRealName','','Id',1,20,0,@Count output
select @Count
*/
/*注意:多表联查,如果两个表有相同的列名,必须指定要查询的列名,不然会报错*/
ALTER PROCEDURE [dbo].[proc_DataPagination]
(
@Table nvarchar(),--表名,支持多表联查
@Fields nvarchar() = N'*',--字段名
@Where nvarchar() = N'',--where条件,不需要加where
@OrderBy nvarchar() = N'',--排序条件,不需要加order by
@CurrentPage int = , --当前页,从1开始,不是0
@PageSize int = ,--每页显示多少条数据
@GetCount int =,--获取的记录总数,0则获取记录总数,不为0则不获取
@Count int = output--总数
)
AS
BEGIN
--没有提供排序字段,默认主键排序
if @OrderBy is null or @OrderBy=''
begin
declare @tempTable varchar()
--多表联查如果没有提供排序字段,自动找第一个表的主键进行排序
if charindex(' on ',@Table)>
set @tempTable=substring(@Table,,charindex(' ',@Table))
else if charindex(',',@Table)>
begin
set @tempTable=substring(@Table,,charindex(',',@Table))
--如果有别名如Article a,User u
if(charindex(' ',@tempTable)>)
set @tempTable=substring(@tempTable,,charindex(' ',@tempTable))
end
else
set @tempTable=@Table--单表查询 --查询表是否存在
if not exists(select * from sysobjects where [name]=@tempTable)
begin
raiserror('查询表%s不存在',,,@tempTable)
return
end --查询排序主键
select @OrderBy=d.name from sysindexes a,sysobjects b,sysindexkeys c,syscolumns d
where c.id = object_id(@tempTable) and c.id = b.parent_obj
and a.name = b.name and b.xtype= 'PK ' and a.indid = and d.colid = c.colid and d.id = c.id
--如果没有主键,如视图
if @OrderBy is null or @OrderBy = ''
begin
raiserror('%s必须提供排序字段',,,@tempTable)
return
end
end --分页大小
if @PageSize <
set @PageSize= --默认当前页
if @CurrentPage <
set @CurrentPage = --选取字段
if @Fields is null or @Fields = ''
set @Fields='*' --过滤条件
if @Where is null or @Where=''
set @Where=''
else
set @Where=' WHERE '+@Where /*设置分页参数*/
declare @startRow varchar(),@endRow varchar()
set @startRow = cast(((@CurrentPage - )*@PageSize + ) as nvarchar())
set @endRow = cast(@CurrentPage*@PageSize as nvarchar()) /*执行查询语句,返回查询结果*/
exec
(
'SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY '+@OrderBy+') AS rownumber,'+@Fields+
' FROM '+@Table+@Where+') AS tempdt WHERE rownumber BETWEEN '+@startRow+' AND '+@endRow
)
/*
如果@GetCount=0,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,
把总页数传回给存储过程,避免再次计算总页数,当数据量很大时,select count(*)速度也要几秒钟)
*/
if(@GetCount=)
begin
declare @strsql nvarchar()
set @strsql='SELECT @i=COUNT(*) FROM '+@Table+@Where
execute sp_executesql @strsql,N'@i int out',@Count OUT--返回总记录数
end
else
set @Count=@GetCount
END

SQL多表联合分页.....的更多相关文章

  1. .net通用CMS快速开发框架——问题1:Dapper通用的多表联合分页查询怎么破?

    最近在弄一个东东,类似那种CMS的后台管理系统,方便作为其它项目的初始化框架用的. 现在遇到个问题,如标题所示:Dapper通用的多表联合分页查询怎么破? 难道只能通过拼接sql或者使用存储过程吗?我 ...

  2. 数据库:sql 多表联合更新【转】

    SQL Update多表联合更新的方法 (1) sqlite 多表更新方法 update t1 set col1=t2.col1 from table1 t1 inner join table2 t2 ...

  3. SQL多表联合查询

    通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 在关系数 据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放 ...

  4. Linq To Sql多表联合查询

    var pro = (from ps in db.ProductInfoes join pt in db.ProductTypees on ps.productType equals pt.pType ...

  5. SQL多表联合查询(交叉连接,内连接,外连接)

    连接查询:     交叉连接:   交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个表中符合查询条件的数据航数乘以第二个表中符合,查询条件的数据行数,例如department ...

  6. SQL:多表联合更新

    update 表一 set 表一.列1 = 表二.列1 from 表一,表二 where 表一.列2 = 表二.列2

  7. 一个对inner jion ...on 的sql多表联合查询的练习

    create database practiceSql; use practiceSql; -- create table student( `id` bigint not null auto_inc ...

  8. sql两表联合查询

    SELECT yt_fault_componentId FROM yt_fault_component a join yt_fault_assembly b on a.yt_fault_assembl ...

  9. sql 多表联合查询更新

    sqlserver: update A a set a.i = b.k from B b where a.key = b.key oracle : update A a set a.i = (sele ...

随机推荐

  1. IOS-闪光灯操作

    AVCaptureDevice.h主要用来获取iphone一些关于相机设备的属性. 前置和后置摄像头 enum { AVCaptureDevicePositionBack = , AVCaptureD ...

  2. Unity3D判断鼠标向右或向左滑动,响应不同的事件

    private var first = Vector2.zero; private var second = Vector2.zero; function Update () { } function ...

  3. Mobile Web 调试指南(2):远程调试

    原文:http://blog.jobbole.com/68606/ 原文出处: 阿伦孟的博客(@allenm ) 第一篇中讲解了如何让手机来请求我们开发电脑上的源码,做到了这步后,我们可以改完代码立即 ...

  4. poj 2311

    Cutting Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2844   Accepted: 1036 Desc ...

  5. Windows启动系统程序命令

    DEVMGMT.MSC - Device Manager 设备管理器 DISKMGMT.MSC - Disk Management 磁盘管理   WindowsXP常用命令http://baike.b ...

  6. Gradle Goodness: Skip Building Project Dependencies

    If we use Gradle in a multi-module project we can define project dependencies between modules. Gradl ...

  7. 程序空间(Program memory)

    The computer program memory is organized into the following: Data Segment (Data + BSS + Heap) Stack ...

  8. linux下ping加时间戳实时输出到文件 放后台运行

    放后台运行命令:setsid 实时输出命令:unbuffer 加时间戳:awk '{ print $0"\t" strftime("%D_%H:%M:%S",s ...

  9. Hadoop基础教程-运行环境搭建

    一.Hadoop是什么 一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. Hadoop实现了一个分布式 ...

  10. 安装MySQldb出错解决方法

    sudo yum install mysql-devel sudo yum install python-devel _mysql.c:36:23: error: my_config.h: No su ...