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. BZOJ 3155: Preprefix sum

    大意:给一个数组,先求出SUM[I],然后动态的求出1-I的SUM[I]的和, 这题得化公式: 树状数组维护两个和:SUM(A[I])(1<=I<=X); SUM(A[I]*(N-I+1) ...

  2. 无网络centos7中部署kubernetes

    本文提供的kubernetes1.1实际为kubernetes0.8,最新kubernetes部署方式见下一篇文章:centos下kubernetes+flannel部署. 一.部署环境信息: 1)m ...

  3. HDU 2843 I Will Win(概率题?,怨念颇深,简单)

    题目 真不想说什么,,,这神题真讨厌,,,多校的.. //又是一道神题... #include<stdio.h> #include<string.h> //最大公约数 int ...

  4. POJ 3276

    Face The Right Way Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2193   Accepted: 103 ...

  5. iOS项目的完整重命名方法图文教程

    原文链接:http://www.cocoachina.com/ios/20150104/10824.html iOS项目的完整重命名方法图文教程 前言:在iOS开发中,有时候想改一下项目的名字,都会遇 ...

  6. 妙味课堂——HTML+CSS(第四课)(二)

    单开一篇来讲一个大点的话题——清浮动    来看下例: <!DOCTYPE html> <html> <head> <meta charset="U ...

  7. 模拟+思维 HDOJ 5319 Painter

    题目传送门 /* 题意:刷墙,斜45度刷红色或蓝色,相交的成绿色,每次刷的是连续的一段,知道最终结果,问最少刷几次 模拟+思维:模拟能做,网上有更巧妙地做法,只要前一个不是一样的必然要刷一次,保证是最 ...

  8. 创建DB2数据库时报错--SQL1052N 数据库路径不存在(Windows)(转载)

    用DB2 v9.7新建数据库的时候,默认路径为:D:\ 把缺省路径“写的是D:\XXX(此目录存在),新建时提示如下:SQL1052N 数据库路径 "D:\XXX" 不存在.如下: ...

  9. Lines演示程序

    #include "stdafx.h"#include "d3d9.h"#include "d3dx9.h" #pragma comment ...

  10. 安卓中bundle的使用

    Bundle类用作携带数据,它类似于Map,用于存放key-value形式的值,相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,Bundle的内部实际上是使用了HashMa ...