实现分页的通用存储过程

显示指定表、视图、查询结果的第X页
对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法
如果视图或查询结果中有主键,不推荐此方法
如果使用查询语句,而且查询语句使用了order by,则查询语句必须包含top 语句

--感谢csdn.net邹建  --*/

/*--调用示例
exec p_show '地区资料'

exec p_show 'select top 100 percent * from 地区资料 order by 地区名称',5,3,'地区编号,地区名称,助记码'
--*/
Create Proc p_show
@QueryStr nvarchar(4000),--表名、视图名、查询语句
@PageSize int=20,--每页的大小(行数)
@PageCurrent int=1,--要显示的页
@FdShow nvarchar (4000)='',--要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000)=''--排序字段列表
as
set nocount on
declare @FdName nvarchar(250)--表中的主键或表、临时表中的标识列名
,@Id1 varchar(20),@Id2 varchar(20)--开始和结束的记录号
,@Obj_ID int--对象ID
--表中有复合主键的处理
declare @strfd nvarchar(2000)--复合主键列表
,@strjoin nvarchar(4000)--连接字段
,@strwhere nvarchar(2000)--查询条件


select @Obj_ID=object_id(@QueryStr)
,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end
,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end
,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end

--如果显示第一页,可以直接用top来完成
if @PageCurrent=1
begin
select @Id1=cast(@PageSize as varchar(20))
exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder)
return
end

--如果是表,则检查表中是否有标识更或主键
if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1
begin
select @Id1=cast(@PageSize as varchar(20))
,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))

select @FdName=name from syscolumns where id=@Obj_ID and status=0x80
if @@rowcount=0--如果表中无标识列,则检查表中是否有主键
begin
if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK')
goto lbusetemp--如果表中无主键,则用临时表处理

select @FdName=name from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
)))
if @@rowcount>1--检查表中的主键是否为复合主键
begin
select @strfd='',@strjoin='',@strwhere=''
select @strfd=@strfd+',['+name+']'
,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'
,@strwhere=@strwhere+' and b.['+name+'] is null'
from syscolumns where id=@Obj_ID and colid in(
select colid from sysindexkeys where @Obj_ID=id and indid in(
select indid from sysindexes where @Obj_ID=id and name in(
select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
)))
select @strfd=substring(@strfd,2,2000)
,@strjoin=substring(@strjoin,5,4000)
,@strwhere=substring(@strwhere,5,4000)
goto lbusepk
end
end
end
else
goto lbusetemp

/*--使用标识列或主键为单一字段的处理方法--*/
lbuseidentity:
exec('select top '+@Id1+@FdShow+' from '+@QueryStr
+' where '+@FdName+' not in(select top '
+@Id2+' '+@FdName+' from '+@QueryStr+@FdOrder
+')'+@FdOrder
)
return

/*--表中有复合主键的处理方法--*/
lbusepk:
exec('select '+@FdShow+' from(select top '+@Id1+' a.* from
(select top 100 percent * from '+@QueryStr+@FdOrder+') a
left join (select top '+@Id2+' '+@strfd+'
from '+@QueryStr+@FdOrder+') b on '+@strjoin+'
where '+@strwhere+') a'
)
return

/*--用临时表处理的方法--*/
lbusetemp:
select @FdName='[ID_'+cast(newid() as varchar(40))+']'
,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))

exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
into #tb from'+@QueryStr+@FdOrder+'
select '+@FdShow+' from #tb where '+@FdName+' between '
+@Id1+' and '+@Id2
)
GO

巨快, 通用表维护增删查改存储过程分页显示
(疾病名称表近2万数据)
导出excel并下载
http://www.adr.gov.cn/download/panyuguang/adrnew/dict_List.asp
下载
ftp://csdn:csdn@61.152.210.28/

换了个空间,没办法,打游击,到处蹭空间。

-- 获取指定页的数据
Create PROCEDURE GetRecordFromPage
    @tblName      varchar(255),       -- 表名
    @fldName      varchar(255),       -- 字段名
    @PageSize     int = 10,           -- 页尺寸
    @PageIndex    int = 1,            -- 页码
    @IsCount      bit = 0,            -- 返回记录总数, 非 0 值则返回
    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
    @strWhere     varchar(1000) = ''  -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL   varchar(6000)       -- 主语句
declare @strTmp   varchar(100)        -- 临时变量
declare @strOrder varchar(400)        -- 排序类型

if @OrderType != 0
begin
    set @strTmp = "<(select min"
    set @strOrder = " order by [" + @fldName +"] desc"
end
else
begin
    set @strTmp = ">(select max"
    set @strOrder = " order by [" + @fldName +"] asc"
end

set @strSQL = "select top " + str(@PageSize) + " * from ["
    + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
    + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
    + @fldName + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
    + @strOrder

if @strWhere != ''
    set @strSQL = "select top " + str(@PageSize) + " * from ["
        + @tblName + "] where [" + @fldName + "]" + @strTmp + "(["
        + @fldName + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
        + @fldName + "] from [" + @tblName + "] where " + @strWhere + " "
        + @strOrder + ") as tblTmp) and " + @strWhere + " " + @strOrder

if @PageIndex = 1
begin
    set @strTmp = ""
    if @strWhere != ''
        set @strTmp = " where " + @strWhere

    set @strSQL = "select top " + str(@PageSize) + " * from ["
        + @tblName + "]" + @strTmp + " " + @strOrder
end

if @IsCount != 0
    set @strSQL = "select count(*) as Total from [" + @tblName + "]"

exec (@strSQL)

GO



[百万级]通用存储过程.分页存储过程.
/*
名称:spAll_ReturnRows
输入:
输出:
调用:
  EXEC spAll_ReturnRows 'Select  * FROM 表名', 页号, 返回记录数, '主键', '排序字段'
  spAll_ReturnRows 'Select  * FROM all_Categories',2,10,'[ID]','[ID]'
说明:[百万级]通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录
作者:Dili J.F. Senders
  邮件:diliatwellknow.net
  网站: http://www.wellknow.net
  更新:20040610
  支持: http://bbs.wellknow.net
  版权:转述时请注明来源:用思维创造未来的Wellknow.net
*/

Create PROCEDURE dbo.spAll_ReturnRows
(
@SQL nVARCHAR(4000),
@Page int,
@RecsPerPage int,
@ID VARCHAR(255),
@Sort VARCHAR(255)
)
AS

DECLARE @Str nVARCHAR(4000)

SET @Str='Select   TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T Where T.'+@ID+' NOT IN
(Select   TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9 orDER BY '+@Sort+') orDER BY '+@Sort

PRINT @Str

EXEC sp_ExecuteSql @Str
GO
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React(74)--onRef在react中的使用

当在子组件中调用onRef函数时&#xff0c;正在调用从父组件传递的函数。this.props.onRef&#xff08;this&#xff09;这里的参数指向子组件本身&#xff0c;父组件接收该引用作为第一个参数&#xff1a;onRef {ref >&#xff08;this.child ref&#xff09;}然后它使用t…

CS144 lab0 笔记

CS144 lab0 笔记 下学期就学习计算机网络了,假期正好找个lab预习一下 配置 直接用 WSL2 Clion(安装在WSL2上) 做的实验,还是比用vscode方便一些的 直接fork仓库git clone …用clion打开,他都会自动生成开始写代码 实验 writing webget(入门) 这个实验就是让你熟悉一下网络…

ASP.NET常用代码

1. 打开新的窗口并传送参数&#xff1a; 传送参数&#xff1a; response.write("<script>window.open(*.aspx?id"this.DropDownList1.SelectIndex"&id1"...")</script>")接收参数&#xff1a; string a Request.QueryString(…

一步步学习SPD2010--第二章节--处理SP网站(6)---- 探索SP网站

SP技术没有一个界面&#xff1b;你可以通过使用Web浏览器或者兼容程序如Office 应用程序&#xff0c;包括SPD。你可以选择适合你必须完成的任务的接口。然而&#xff0c;根据你选择的程序&#xff0c;你可能有SP网站的不同视图。如果你使用MS Word&#xff0c;你只看到了网站和…

江民公司网络版问题汇总三

客户端和主控连接问题 登录江民控制台时&#xff0c;查找主机IP地址时查找不到&#xff0c;下面的客户端也查找不到主控的IP地址。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1&#xff0e; 如果您的主控机器是XP 或者2003…

CS144 lab1 笔记

CS144 lab1 笔记 上图是TCP实现中模块和数据流的安排,我们要实现的就是StreamReassembler 一个字符重组器,将乱序的字符串,按照索引排序,使其成为连续字符,供TCPSender和TCPReceiver使用 有容量限制,超出的字符直接丢掉(不是整个片段) TCP接收到的片段从零开始,不会溢出 任何…

Netty 4.0 新的特性及需要注意的地方

Netty 4.0 新的特性及需要注意的地方 这篇文章和你一起过下Netty的主发行版本的一些显著的改变和新特性&#xff0c;让你在把你的应用程序转换到新版本的时候有个概念。 项目结构改变 Netty的包名从org.jboss.netty改为io.netty&#xff0c;因为我们不在是JBoss.org的一部分了。…

CS144 lab2 笔记

CS144 lab2 笔记 介绍 在lab0中&#xff0c;我们实现了一个ByteStream。 在lab1中&#xff0c;实现了一个重组字符片段的StreamReassembler&#xff0c;重组收到的字符片段&#xff0c;并且将排序好的字符串退送到ByteStream 在lab2中&#xff0c;j将实现一个TCPReceiver,它…

附件下载,中文文件名乱码如何解决???

问:我写了个程序&#xff0c;里面有文件要作为附件下载&#xff0c;英文文件名都正常&#xff0c;但中文文件名就会乱码&#xff0c;不知道如何解决&#xff0c;望高手指点。代码如下&#xff1a;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&#xff1d;&am…

养生之道

晚上 9-11点为免疫系统&#xff08;淋巴&#xff09;排毒时间&#xff0c;此段时间应安静或听音乐 晚间 11-凌晨 1点&#xff0c;肝的排毒&#xff0c;需在熟睡中进行。 凌晨 1-3点&#xff0c;胆的排毒&#xff0c;亦同。 凌晨 3-5点&#xff0c;肺的排毒。此即为何咳嗽的人…

freemarker小例子

1.在D盘下创建一个目录D:\\freemarker 2.在以上目录中放入一个模板文件test.ftl,内容如下&#xff1a; 第一个测试程序&#xff1a;${abc} 3.java代码如下&#xff08;需要导入freemarker.jar包&#xff09; Java代码 : package cn.freeteam.util;import java.io.BufferedW…

CS144 计算机网络实验 lab3 笔记

CS144 计算机网络实验 lab3 笔记 介绍 本实验中,我们将会在之前实验的基础上,实现一个TCP sender ----将字节流转换成数据报并发送. TCP协议是一个在不可靠的协议上提供可靠的,流量控制的协议。 我们在本实验中会实现一个TCP发送端&#xff0c;负责将发送端应用层传入的比特…

发送附件时,防止文件名中的中文字符变成乱码

在.net2005中&#xff0c;利用System.Net.Mail;下的MailMessage类发送邮件&#xff0c;为了防止附件文件名中的中文字符变成乱码&#xff0c;需要加attachment.NameEncoding Encoding.GetEncoding("GB2312");详细见下面的函数&#xff1a; private bool SendMail(s…

React(77)--纯函数和非纯函数

let student {firstName: "testing",lastName: "testing",marks: 500 }// 非纯函数 function appendAddress() {student.address {streetNumber:"0000", streetName: "first", city:"somecity"}; }console.log(appendAddr…

计算机进程小知识

最基本的系统进程&#xff08;也就是说&#xff0c;这些进程是系统运行的基本条件&#xff0c;有了这些进程&#xff0c;系统就能正常运行&#xff09;: smss.exe Session Manager csrss.exe 子系统服务器进程 winlogon.exe 管理用户登录 services.exe 包含很多系统服务 lsass.…

CS144 lab4 计算机网络实验 笔记

CS144 lab4 计算机网络实验 笔记 介绍 本实验中,我们将组合TCP sender和TCP receiver实现一个完整的TCP connection TCP是全双工连接,所以两方可以同时接收/发送信息,一端随时都有可能接收.发送信息 主要根据上图实现 tcp_connection.cc #include "tcp_connection.hh&…

unity2D技术学习与整理

目前有关unity2D的教程以及原理几乎都是国外的。我在这方面也是新手&#xff0c;看了一些例子有很多不懂的地方。 这个网站提供的教程很有参考价值 http://brackeys.com/ 还有这个 http://pixelnest.io/tutorials/2d-game-unity/table-of-contents/转载于:https://www.cnblogs.…

C# GDI+ 实现图片分隔

1. 概述 有时候我们需要在web页面上显示一张图&#xff0c;比如说一张地图&#xff0c;而这张地图会比较大。这时候如果我们把一张大图分隔成一组小图&#xff0c;那么客户端的显示速度会明显地感觉块。希望阅读本文对你有所帮助。 2. 实现思路 .NET Framework GDI 为我们提…

让人吐血的文章,要被气死了

来源&#xff1a;[url]http://dx.3800hk.com/news/w21/124454.html[/url]请注意文中这两部分新世纪&#xff1a;为什么在李俊落网之前&#xff0c;很多人都怀疑这是杀毒软件公司的人干的&#xff0c;目的是为了多卖几套杀毒软件&#xff1f;李铁军&#xff1a;人们一直都有这种…