上次写了通用存储过程。感觉还是有很大的BUG。就是条件不能参数画化。这个BUG可以说是致命的。但是我一直想在用什么方法能解决这个东西。其实我只是想写少量的代码来做更多的事情。我想能不能传集合给存储过程但是好像这个是行不通没办法只能写死。

  上代码吧

  

IF (SELECT COUNT(*) FROM sysobjects s WHERE s.[type]='P' AND s.name='SP_PAGE_PRACTICAL')>0
DROP PROC SP_PAGE_PRACTICAL;
GO
CREATE PROC SP_PAGE_PRACTICAL(@tbName VARCHAR(50),@Condition NVARCHAR(1000),@ConditionColumn VARCHAR(100),@ConditionColumn2 VARCHAR(100),@ConditionColumn3 VARCHAR(100),@ConditionColumn4 VARCHAR(100),@ConditionColumn5 VARCHAR(100),@SortColumn VARCHAR(100), @isDesc INT,@thisPage INT,@PageRowNumber INT,@sumPage INT OUT)
AS
BEGIN
BEGIN TRANSACTION
DECLARE @exeSql NVARCHAR(1000) ;
DECLARE @sumRowNumber INT,@descStr NVARCHAR(10);
SET @exeSql='select @sumRowNumber=count(*) from '+@tbName+' '+@Condition;
--执行动态SQL获取值
EXEC sp_executesql @exeSql, N'@sumRowNumber int out,@ConditionColumn VARCHAR(100),@ConditionColumn2 VARCHAR(100),
@ConditionColumn3 VARCHAR(100),@ConditionColumn4 VARCHAR(100),@ConditionColumn5 VARCHAR(100)',
@sumRowNumber OUT,@ConditionColumn,@ConditionColumn2,@ConditionColumn3,@ConditionColumn4,@ConditionColumn5;
--计算总页数
SET @sumPage=(@sumRowNumber-1)/@PageRowNumber+1;
--计算分页行
DECLARE @BeginRow INT,@EndRow INT;
SET @BeginRow=(@thisPage-1)*@PageRowNumber+1;
SET @EndRow=@thisPage*@PageRowNumber;
--计算排序
IF @isDesc=1
BEGIN
SET @descStr='desc';
END
ELSE
BEGIN
SET @descStr='asc';
END
SET @exeSql='select * from (select a.*,ROW_NUMBER() OVER(order by '+@SortColumn+' '+@descStr+ ') as rowIndex from '+@tbName+' a '+@Condition+') a where a.rowIndex BETWEEN '+CONVERT(VARCHAR(10),@BeginRow)+' AND '+CONVERT(VARCHAR(10),@EndRow)+'';
EXEC sp_executesql @exeSql,N'@ConditionColumn VARCHAR(100),
@ConditionColumn2 VARCHAR(100),@ConditionColumn3 VARCHAR(100),@ConditionColumn4 VARCHAR(100),
@ConditionColumn5 VARCHAR(100)',@ConditionColumn,@ConditionColumn2,@ConditionColumn3,@ConditionColumn4,@ConditionColumn5;
--事物提交还是回滚
if @@ERROR>0
BEGIN
ROLLBACK TRANSACTION;
END
ELSE
BEGIN
COMMIT TRANSACTION;
END;
END

  我想我的项目里最大5个条件查询就已经OK。根据你的项目来确定有多少个条件吧 。至于参数怎么传递很简单。就需要我们发挥无线的思想了。

DECLARE @sumPage INT;
EXEC SP_PAGE_PRACTICAL 'tb_User_Info','where user_info_id=@ConditionColumn and (1=1 or 1=@ConditionColumn2 or 1=@ConditionColumn3 or 1=@ConditionColumn4 or 1=@ConditionColumn5)',1,1,1,1,1,'user_info_id',1,1,10,@sumPage OUT

  上面是我写的测试程序。如果有1个条件我就申明一个其他我全部1=1。完全不和其他条件冲突。

  如果哪位大神有更好的方法和更好的思路可以解决问题。我们可以一起探讨和研究哦

  

  

改良版的SQL Service 通用存储过程分页的更多相关文章

  1. MS SQLSERVER通用存储过程分页

    最近在面试的时候,遇到个奇葩的秃顶老头面试官. 问:写过存储过程分页吗? 答:没写过,但是我知道分页存储的原理,我自己也写过,只是在工作中没写过. 问:那你这么多年工作中就没写过吗? 答:的确没写过, ...

  2. Sql Service中的分页

    创建存储过程如下: CREATE PROCEDURE [dbo].[sp_GetPageList] ), --表名 ) = '*', --字段名(全部字段为*) ), --排序字段(必须!支持多字段) ...

  3. Sql Service存储过程分页

    一起是用oracle数据库..感觉oracle数据库强大.查询速度是杠杠的.换了家公司用的是SQL SERVICE.以前用了1年现在捡回以前的记忆.动手写了动态SQL过存储过程分页.感觉和oracle ...

  4. SQL存储过程分页(通用的拼接SQL语句思路实现)

    多表通用的SQL存储过程分页 案例一: USE [Community] GO /****** Object: StoredProcedure [dbo].[Common_PageList] Scrip ...

  5. 如此高效通用的分页存储过程是带有sql注入漏洞的

    原文:如此高效通用的分页存储过程是带有sql注入漏洞的 在google中搜索“分页存储过程”会出来好多结果,是大家常用的分页存储过程,今天我却要说它是有漏洞的,而且漏洞无法通过修改存储过程进行补救,如 ...

  6. 一个通用的分页存储过程实现-SqlServer(附上sql源码,一键执行即刻搭建运行环境)

    使用前提 查询表必须有ID字段,且该字段不能重复,建议为自增主键 背景 如果使用ADO.NET进行开发,在查询分页数据的时候一般都是使用分页存储过程来实现的,本文提供一种通用的分页存储过程,只需要传入 ...

  7. Sql Server通用分页存储过程

    Sql Server2005通用分页存储过程 CREATE PROCEDURE [dbo].[Common_GetPagedList] ( @TableName nvarchar(100), --表名 ...

  8. 我的sql数据库存储过程分页- -

    以前用到数据库存储过程分页的时候都是用 not in 但是最近工作的时候,随着数据库记录的不断增大,发现not in的效率 真的不行 虽然都设置了索引,但是当记录达到10w的时候就发现不行了,都是需要 ...

  9. SQL Server 存储过程 分页查询

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...

随机推荐

  1. C# - DES加密+解密

    #region ===========================DES算法=================================== private static string ke ...

  2. multiset集合容器的集合运算:并、交、差

    set和multiset的内部通常是采用平衡二叉树来实现.当放入元素时,会按照一定的排序方法自动排序,默认是按照less<>排序规则来排序.这种自动排序的特性加速了元素查找的过程,但问题是 ...

  3. android同时使用多个library时的问题

    剧情是这样,我的app要使用四个library,如:LibraryA,LibraryB.这两个库又都需要support.v4.jar. 由于加载的时间不同,所以四个support.v4.jar不同,出 ...

  4. mysql插入大量数据

    创建实验表: CREATE TABLE `a` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` char(50)  NOT NULL, `type` ch ...

  5. MySQL初始化故障-----mysql_config_editor中的坑

    今天准备新启一个MySQL实例,结果竟然无法初始化,内容如下: -------------------------------------------------------------------- ...

  6. HashMap为什么线程不安全(hash碰撞与扩容导致)

    一直以来都知道HashMap是线程不安全的,但是到底为什么线程不安全,在多线程操作情况下什么时候线程不安全? 让我们先来了解一下HashMap的底层存储结构,HashMap底层是一个Entry数组,一 ...

  7. asp.net linq查询环境搭建

    本文是以sqlserver2008为数据库,vs2013为开发工具来介绍的. 要搭建这样一个数据库的操作环境,首先建立一个类库项目 然后在这个类库项目中添加几个类:DBDataContext数据库上下 ...

  8. Android开发环境的搭建之(四)虚拟设备AVD的基本配置

    配置Android系统语言包为中文简体.点击导航栏左数第二个“菜单”图标 选择“System settings”. 选择“Language & Input” 选择“Language” 选择“中 ...

  9. (转)在.net中序列化读写xml方法的总结

    阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数 ...

  10. 前端公共库cdn服务推荐//提高加载速度/节省流量

    前端公共库cdn服务推荐,使用可以提高js库加载速度同时也可以节省自己空间的流量,CDN加速公共库虽好,不过一定要使用靠谱的前端cdn服务提供方. 以下整理出比较靠谱的国内cdn加速服务器.排名不分先 ...