Sqlserver 通用存储过程(二) 联合主键

CREATE PROC P_public_ViewPage
    
/**//**//**//*
        no_mIss 通用分页存储过程 2007.3.1  QQ:34813284
        适用于联合主键/单主键/存在能确定唯一行列/存在能确定唯一行的多列 (用英文,隔开)
        调用:
            第一页查询时返回总记录和总页数及第一页记录:
            EXECUTE P_public_ViewPage_per 'TableName','col1,col2,col3,col4','pk1,pk2,pk3',
                'col5>0 and col7<9','pk1 asc,pk2 asc,pk3 asc',0,10,1,
                @TotalCount OUTPUT,@TotalPageCount OUTPUT
            其它页调用,比如第89页(假设第一页查询时返回总记录为2000000):
            EXECUTE P_public_ViewPage_per 'TableName','col1,col2,col3,col4','pk1,pk2,pk3',
                'col5>0 and col7<9','pk1 asc,pk2 asc,pk3 asc',2000000,10,89,
                @TotalCount OUTPUT,@TotalPageCount OUTPUT
    
*/


    
@TableName VARCHAR(200),     --表名
    @FieldList VARCHAR(2000),    --显示列名
    @PrimaryKey VARCHAR(100),    --单一主键或唯一值键或联合主键列表(用英文,隔开)或能确定唯一行的多列列表(用英文,隔开)
    @Where VARCHAR(1000),        --查询条件 不含'where'字符
    @Order VARCHAR(1000),        --排序 不含'order by'字符,用英文,隔开  
    @RecorderCount INT,          --记录总数 0:会返回总记录
    @PageSize INT,               --每页输出的记录数
    @PageIndex INT,              --当前页数
    @TotalCount INT OUTPUT,      --返回记录总数
    @TotalPageCount INT OUTPUT   --返回总页数
AS

    
SET NOCOUNT ON
    
    
SET @FieldList = REPLACE(@FieldList,' ','')
    
IF @FieldList = '*' 
        
BEGIN SET @FieldList = 'A.*'END
    
ELSE
        
BEGIN
            
SET @FieldList = 'A.' + REPLACE(@FieldList,',',',A.')
        
END
    
    
WHILE CHARINDEX('',@Order)>0
    
BEGIN
        
SET @Order = REPLACE(@Order,'',',')
    
END

    
IF ISNULL(@TableName,''= '' OR ISNULL(@PrimaryKey,''= ''        
        
OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0
    
BEGIN        
        
RETURN
    
END
 
    
DECLARE @new_where1 VARCHAR(1000)
    
DECLARE @new_where2 VARCHAR(1000)
    
DECLARE @new_where3 VARCHAR(1000)
    
DECLARE @new_where4 VARCHAR(1000)
    
DECLARE @new_order1 VARCHAR(1000)
    
DECLARE @new_order2 VARCHAR(1000)
    
DECLARE @Fields VARCHAR(1000)
    
DECLARE @Sql VARCHAR(8000)
    
DECLARE @SqlCount NVARCHAR(4000)

    
SET @Fields = @PrimaryKey + ','
    
SET @new_where2 = ''
    
SET @new_where4 = ''


    
IF ISNULL(@where,''= ''
        
BEGIN
            
SET @new_where1 = ' '
            
SET @new_where3 = ' WHERE '
        
END
    
ELSE
        
BEGIN            
            
SET @new_where1 = ' WHERE ' + @where + ' '
            
SET @new_where3 = ' WHERE 1=1 ' 
                    
+ REPLACE(' AND ' + @where,' AND ',' AND A.')+ ' AND '
        
END
    
    
WHILE CHARINDEX(',',@Fields)>0
    
BEGIN
        
SET @new_where2 = @new_where2 
            
+ 'A.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1))
            
+ ' = B.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1)) + ' AND '
        
SET @new_where4 = @new_where4 
            
+ 'B.' + LTRIM(LEFT(@Fields,CHARINDEX(',',@Fields)-1)) + ' IS NULL AND '
        
SET @Fields = SUBSTRING(@Fields,CHARINDEX(',',@Fields)+1,LEN(@Fields))
    
END
    
SET @new_where2 = LEFT(@new_where2,LEN(@new_where2)-4)
    
SET @new_where4 = LEFT(@new_where4,LEN(@new_where4)-4)

    
IF ISNULL(@order,''= '' 
        
BEGIN
            
SET @new_order1 = ''
            
SET @new_order2 = ''
        
END
    
ELSE
        
BEGIN
            
SET @new_order1 = ' ORDER BY ' + @Order
            
SET @new_order2 = ' ORDER BY ' 
                    
+ RIGHT(REPLACE(',' + @Order,',',', A.' ),
                            
LEN(REPLACE(',' + @Order,',',', A.' ))-1)
        
END

    
SET @SqlCount = 'SELECT @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'
                    
+ CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName 
                    
+ ' A ' +  @new_where1
    
    
IF @RecorderCount = 0
        
BEGIN
             
EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',
                               
@TotalCount OUTPUT,@TotalPageCount OUTPUT
        
END
    
ELSE
        
BEGIN
             
SELECT @TotalCount = @RecorderCount            
        
END

    
IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)
        
BEGIN
            
SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize)
        
END
    
IF @PageIndex = 1
        
BEGIN
            
SET @Sql = 'SELECT TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM ' 
                       
+ @TableName + ' A'+ @new_where1 + @new_order1
        
END
    
ELSE
        
BEGIN
            
SET @Sql = 'SELECT TOP ' + STR(@PageSize+ ' ' + @FieldList + ' FROM ' 
                       
+ @TableName + ' A LEFT JOIN (SELECT TOP ' 
                       
+ STR(@PageSize*(@PageIndex-1)) 
                       
+ ' ' + @PrimaryKey + ' FROM ' + @TableName + @new_where1
                       
+ @new_order1 + ' )B ON ' + @new_where2 + @new_where3 
                       
+ @new_where4 + @new_order2
        
END

EXEC(@Sql)
GO

转载于:https://www.cnblogs.com/liulf/archive/2009/02/17/1392637.html

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

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

相关文章

理解ALSA

最近处理音频的问题&#xff0c;所以看了一些不错的文章&#xff0c;整理一些有用的资料出来&#xff0c;有需要的可以收藏。ALSA的框架图&#xff1a;这个图可以说是我目前看到最不错的&#xff0c;我发现很多应用开发的&#xff0c;一出现解决不了的问题&#xff0c;或者奇怪…

Xshell 6如何设置多个session显示在同一个窗口

刚才安装了Xshell 6之后&#xff0c;发现在同一个窗口只能显示4个session&#xff0c;网上查找了一些资料但是都不是想要的结果&#xff0c;经过几分钟的查找&#xff0c;终于找到了设置在同一个窗口session的个数&#xff0c;因此记录下来&#xff0c;或者给与他人帮助。以下以…

blockUI应用到Asp.Net页面时服务器控件(Button等)失效的问题

问题&#xff1a;在Asp.Net页面中用blockUI这个控件实现弹出窗口的效果&#xff0c;弹出页面内容为页面中某个Panel中的内容&#xff0c;包含TextBox、Button等服务器控件。使用时就简单的设置message属性。问题出来了&#xff0c;当显示这个弹出页面后&#xff0c;所有Button等…

android DatePicker

为什么80%的码农都做不了架构师&#xff1f;>>> public class DatePicker extends FrameLayout java.lang.Object android.view.View android.view.ViewGroup android.widget.FrameLayout android.widget.DatePicker DatePicker 一个选择年月日的日历布局视图 公…

一次限制进程的 CPU 用量的实操过程

大家好&#xff0c;我是飞哥&#xff01;给大家分享一个事情。背景是这样的&#xff0c;我们要测试某个第三方 SDK 运行性能&#xff0c;这是个 CPU 密集型的服务。我想评估一下它运行一遍到底有多吃 CPU&#xff0c;以便评估上线后我们需要部署多少台服务器。我们是在一台 16 …

map与unordered_map的区别

set/map底层实现的机制是红黑树。红黑树是一种近似于平衡的二叉查找树&#xff0c;默认是按升序排序的。在红黑树上做查找、插入、删除操作的时间复杂度为O(logN)。 红黑树的缺点&#xff1a;空间占用率高&#xff0c;每一个节点都需要额外保存父节点、孩子节点和红/黑性质&am…

navicat不同数据库数据传输

复制fo的t_fo_account表结构和数据到base库 结果 转载于:https://www.cnblogs.com/feifeicui/p/10307646.html

收藏了两年的嵌入式AI资源学习笔记,今天全分享给大家(附代码/资料/视频/学习规划)...

当前乃至未来5-10年&#xff0c;嵌入式开发者还有哪些风口&#xff1f;”画外音&#xff1a;风口的本质&#xff0c;其实就是一段时间的人才供需不平衡。说白了就是由于行业突变&#xff0c;敏锐的资本快速进入&#xff0c;导致短时间内行业大量扩张&#xff0c;需要大量开发者…

Vmware由于centos升级内核不可运行(C header files matching your running kernel were not found)的解决方案...

C header files matching your running kernel were not found. Refer to your distributions documentation for installation instructions - NoH4cker - 博客园 http://www.cnblogs.com/NoH4cker/p/4840571.html centos6 安装wmwaretools找不到kernel header - jiejnan - 博…

分享一个消息组件

前段时间在收集项目素材时发现一个很好用的消息组件ymPrompt,顺便收集了圈子里关于这个组件的文章&#xff0c;感觉介绍不是很完善。 废话少说先看一下演示效果: 演示Demo: http://www.ajaxbbs.net/test/ymPrompt4.0/demo.html 截取的图片: Vista样式 简短的实现脚本: Code--导…

用C语言搞机器学习,来个最基础的Knn入门

本来是准备周末加班两天的&#xff0c;然后&#xff0c;临时突然其他事情又取消了。顺便看了下csdn&#xff0c;看到一篇介绍KNN的&#xff0c;因为我现在做的也是属于机器学习方向&#xff0c;那自然也要了解一些这部分。KNN是什么&#xff1f;KNN可以说是最简单的分类算法之一…

最简单的断线断点检测器电路

要在长长的电线中找到究竟是哪里断开了&#xff0c;可以做一个断线断点检测器。而且几个元器件就可以实现&#xff0c;非常简单。这个断线断点检测器不仅可以识别火线、零线&#xff0c;还可以检测电线是哪里断开了。实际是检测哪里的磁场强&#xff0c;哪里的电磁辐射大。来看…

声学发展史之——人工智能(AI)声学

引言最近接手了一个EOL (End of Line)的项目&#xff0c;用高斯混合模型GMM (Gaussian Mixture Model)作生产线上产品的质量检测。虽然提取特征的过程很痛苦&#xff0c;不过还是很有意思。也是因为兴趣&#xff0c;去年在Coursera上了吴恩达的Machine Learning&#xff0c;算是…

一个application多个 URL

需求&#xff1a; 希望一个sharepoint网站&#xff0c;有多个网址去访问。例如&#xff1a;http://moss:8080/的网站&#xff0c;http://aphla.prismshareusa.int/ 和 http://aphla.carat.int/ 两个网站同时访问。 解决方法如下&#xff1a; 1&#xff09;创建DNS…

写的重采样文章被大佬看到了

他让我看重采样昨天写的重采样文章被一个大佬看到了&#xff0c;给我发了消息如下大佬是个技术原厂Linux方向的负责人&#xff0c;我在工作上遇到的好几次疑难杂症都是在他的指点下得到解决&#xff0c;而且平时讨论技术的时候&#xff0c;能感觉到他对技术问题理解很深。从他的…

根据IP地址获取主机名称

IP地址获得主机名称 1. 根据IP地址获得主机名称///<summary>///根据IP地址获得主机名称 ///</summary>///<param name"ip">主机的IP地址</param>///<returns>主机名称</returns>publicstringGetHostNameByIp(stringip) …

vector中的reserve() 与 resize()

resize()与reserve()都是vector容器中的方法&#xff1a; resize():改变了capacity()和size() reserve():增加了vector的capacity()&#xff0c;但是它的size()没有改变 #include <iostream> #include <stdio.h> #include <vector> #include<functiona…

【C++】考虑virtual函数以外的其他选择

假设你正在写一个视频游戏软件&#xff0c;游戏里有各种各样的人物&#xff0c;每个人物都有健康状态&#xff0c;而且不同的人物可能以不同的方式计算他们的健康指数&#xff0e;该如何设计游戏里的人物&#xff0c;主要如何提供一个返回人物健康指数的接口&#xff0e; 方法一…

不知道你们遇到这样的问题没?

最近在网上看到这样一个内容https://developer.horizon.ai/forumDetail/118363914936419003关于J5/J3/J2平台的底层软件地平线内部的释放计划和形式&#xff1f;您好&#xff1a;问题如题&#xff0c;我们当前在地平线J5平台展开进行的项目居多&#xff0c;跟贵司接触和合作的部…

boost::split()的使用方式

引用的头文件 <boost/algorithm/string.hpp> boost::split()函数用于切割string字符串&#xff0c;将切割之后的字符串放到一个std::vector<std::string> 之中&#xff1b; 有4个参数&#xff1a; 以boost::split(type, select_list, boost::is_any_of(",&…