改良版的SQL Service 通用存储过程分页
上次写了通用存储过程。感觉还是有很大的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 通用存储过程分页的更多相关文章
- MS SQLSERVER通用存储过程分页
最近在面试的时候,遇到个奇葩的秃顶老头面试官. 问:写过存储过程分页吗? 答:没写过,但是我知道分页存储的原理,我自己也写过,只是在工作中没写过. 问:那你这么多年工作中就没写过吗? 答:的确没写过, ...
- Sql Service中的分页
创建存储过程如下: CREATE PROCEDURE [dbo].[sp_GetPageList] ), --表名 ) = '*', --字段名(全部字段为*) ), --排序字段(必须!支持多字段) ...
- Sql Service存储过程分页
一起是用oracle数据库..感觉oracle数据库强大.查询速度是杠杠的.换了家公司用的是SQL SERVICE.以前用了1年现在捡回以前的记忆.动手写了动态SQL过存储过程分页.感觉和oracle ...
- SQL存储过程分页(通用的拼接SQL语句思路实现)
多表通用的SQL存储过程分页 案例一: USE [Community] GO /****** Object: StoredProcedure [dbo].[Common_PageList] Scrip ...
- 如此高效通用的分页存储过程是带有sql注入漏洞的
原文:如此高效通用的分页存储过程是带有sql注入漏洞的 在google中搜索“分页存储过程”会出来好多结果,是大家常用的分页存储过程,今天我却要说它是有漏洞的,而且漏洞无法通过修改存储过程进行补救,如 ...
- 一个通用的分页存储过程实现-SqlServer(附上sql源码,一键执行即刻搭建运行环境)
使用前提 查询表必须有ID字段,且该字段不能重复,建议为自增主键 背景 如果使用ADO.NET进行开发,在查询分页数据的时候一般都是使用分页存储过程来实现的,本文提供一种通用的分页存储过程,只需要传入 ...
- Sql Server通用分页存储过程
Sql Server2005通用分页存储过程 CREATE PROCEDURE [dbo].[Common_GetPagedList] ( @TableName nvarchar(100), --表名 ...
- 我的sql数据库存储过程分页- -
以前用到数据库存储过程分页的时候都是用 not in 但是最近工作的时候,随着数据库记录的不断增大,发现not in的效率 真的不行 虽然都设置了索引,但是当记录达到10w的时候就发现不行了,都是需要 ...
- SQL Server 存储过程 分页查询
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...
随机推荐
- C语言当中的作用域
在C语言当中,变量的作用域分为两种:全局变量和局部变量. 在所有函数之外声明的变量是全局变量,这些变量可以在整个程序当中被访问: 局部变量是在某一对大括号({})之间生命的变量,这些变量在这对大括号之 ...
- [置顶] ASP.Net中服务器控件的生命周期
(1)初始化:在此阶段中,主要完成两项工作:一.初始化在传入Web请求生命周期内所需的设置;二.跟踪视图状态.首先,页面框架通过默认方式引发Init事件,并调用OnInit()方法,控件开发人员可以重 ...
- 用户名_密码获取Access_Token
http://www.ivanjevremovic.in.rs/live/domination/red/index-async-slider.html http://designova.net/rev ...
- web api (.NET 4.5)
摘自http://blog.csdn.net/fangxing80/article/details/7318289 在刚刚发布的 ASP.NET MVC 4 中,有一个值得注意的新特性——Web Ap ...
- UVA 1343 The Rotation Game
题意: 给出图,往A-H方向旋转,使中间8个格子数字相同.要求旋转次数最少,操作序列字典序尽量小. 分析: 用一维数组存24个方格.二维数组代表每个方向对应的7个方格.IDA*剪枝是当8-8个方格中重 ...
- VS2012JSON自动生成对应的类
一.复制JSON数据如图 {Key:"aaaa",Value:"bbbb"} 二.点击以下操作
- C# 运算符 if
运算符: 一.算术运算符: + - * / % ——取余运算 取余运算的应用场景: 1.奇偶数的区分. 2.把数变化到某个范围之内.——彩票生成. 3.判断能否整除.——闰年.平年. int a = ...
- Javascript Number类型常见迷惑点
1:NaN(Not a Number) 表示一个本来要返回数值的操作数没有返回数值的情况.在ECMAscript中,任何数除以0会返回NaN[ps:实际上只有0/0会返回NaN],正(负)数除以0会返 ...
- 图的最短路径问题————树上奶牛(tree.cpp)
和往常一样,继续从题目引入 树上奶牛 (tree.cpp) [题目描述] 农夫John的奶牛不是住在地上而是住在树上的QWQ. 奶牛之间需要串门,不过在串门之前他们会向John询问距离的大小.可是Jo ...
- locate linux文件查找命令
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...