SQL多表联合分页.....
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多表联合分页.....的更多相关文章
- .net通用CMS快速开发框架——问题1:Dapper通用的多表联合分页查询怎么破?
最近在弄一个东东,类似那种CMS的后台管理系统,方便作为其它项目的初始化框架用的. 现在遇到个问题,如标题所示:Dapper通用的多表联合分页查询怎么破? 难道只能通过拼接sql或者使用存储过程吗?我 ...
- 数据库:sql 多表联合更新【转】
SQL Update多表联合更新的方法 (1) sqlite 多表更新方法 update t1 set col1=t2.col1 from table1 t1 inner join table2 t2 ...
- SQL多表联合查询
通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 在关系数 据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放 ...
- Linq To Sql多表联合查询
var pro = (from ps in db.ProductInfoes join pt in db.ProductTypees on ps.productType equals pt.pType ...
- SQL多表联合查询(交叉连接,内连接,外连接)
连接查询: 交叉连接: 交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个表中符合查询条件的数据航数乘以第二个表中符合,查询条件的数据行数,例如department ...
- SQL:多表联合更新
update 表一 set 表一.列1 = 表二.列1 from 表一,表二 where 表一.列2 = 表二.列2
- 一个对inner jion ...on 的sql多表联合查询的练习
create database practiceSql; use practiceSql; -- create table student( `id` bigint not null auto_inc ...
- sql两表联合查询
SELECT yt_fault_componentId FROM yt_fault_component a join yt_fault_assembly b on a.yt_fault_assembl ...
- 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 ...
随机推荐
- 在JavaScript中判断整型的N种方法
原文:http://www.cnblogs.com/YcYYcY/p/3759184.html 整数类型(Integer)在JavaScript经常会导致一些奇怪的问题.在ECMAScript的规范中 ...
- 谈谈arm下的函数栈
引言 这篇文章简要说说函数是怎么传入参数的,我们都知道,当一个函数调用使用少量参数(ARM上是少于等于4个)时,参数是通过寄存器进行传值(ARM上是通过r0,r1,r2,r3),而当参数多于4个时,会 ...
- PHP几个函数
pack: 数据装入一个二进制字符串 http_build_query: 将数组转化成URL GET参数的形式. get_class:返回对象的类名,注:即使是在父类方法中调用也是返回子类的类名. g ...
- 浅谈javascript中的数据类型和引用类型
1.概述 javascript中有五种简单数据类型和一种复杂数据类型. 分别是:undefind, null, number, string ,boolean ----简单数据类型 ...
- 由浅入深了解Thrift之微服务化应用架构
为什么选择微服务 一般情况下,业务应用我们都会采用模块化的分层式架构,所有的业务逻辑代码最终会在一个代码库中并统一部署,我们称这种应用架构为单体应用. 单体应用的问题是,全部开发人员会共享一个代码库, ...
- Unix安装BerkeleyDB
下载安装包Berkeley DB 5.3.21.tar.gz http://www.oracle.com/technetwork/products/berkeleydb/downloads/index ...
- Peer certificate cannot be authenticated with known CA certificates.
I was trying to post to a webservice and was getting the 60 error code: Peer certificate cannot be a ...
- ExtJs之DHTML,DOM,EXTJS的事件绑定区别
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- IDT hook KiTrap03
关于idt的基本知识就不进行赘述了,先看一个例子 0 ;------->进入内核,找到中断处理例程KiTrap03 0 这段代码执行,触发3号中断,然后开始执行KiTrap03例程,要知道,执行 ...
- spring_150806_hibernate_non_transaction
添加hibernate的相关jar包! 实体类: package com.spring.model; import javax.persistence.Entity; import javax.per ...