【老码农怀旧】一个简单好用的分页存储过程

数据库存储过程是一组预先创建并用指定的名称存储在数据库服务器上的 SQL 语句,将使用比较频繁或者比较复杂的操作,预先用 SQL 语句写好并用一个指定的名称存储起来,以后当需要数据库提供与已定义好的存储过程的功能相同的服务时,只需再次执行该存储过程。

数据库存储过程的优点:
(1)存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度。
(2)通常,复杂的业务逻辑需要多条 SQL 语句。这些语句要分别地从客户机发送到服务器,当客户机和服务器之间的操作很多时,将产生大量的网络传输。如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会大大减少,降低了网络负载。
(3)存储过程创建一次便可以重复使用,从而可以减少数据库开发人员的工作量。
(4)安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用 EXECUTE 权限调用存储过程,无需拥有访问底层数据库对象的显式权限。

数据库存储过程的缺点:
(1)SQL本身的局限性-SQL本省是一种面向结构化查询的语言,本质是面向过程的,面对复杂的业务逻辑处理起来会力不从心
(2)移植性差,不同的数据库SQL语法有些差别
(3)不易调试
(4)对开发人员SQL能力要求比较高。ps:现在很多新手都不知道如何创建存储过程╮(╯_╰)╭ 
    目前常用的数据库都支持存储过程,例如 IBM DB2,Microsoft SQL Server,Oracle,Access 等,开源数据库系统 MySQL 也在 5.0 的时候实现了对存储过程的支持。

一个简单好用的分页存储过程实现

CREATE PROCEDURE [dbo].[SP_K_PAGE]
(
	@totalCount INT OUTPUT,  --过滤后的总记录数
	@tableName varchar(MAX),--表名
	@orderSql varchar(MAX),--排序字段
	@where nvarchar(MAX)='', --过滤条件
	@pageIndex int=1,--页码
	@pageSize int=10--页大小
)
AS 

DECLARE @pageSql NVARCHAR(MAX); --分页sql
DECLARE @whereSql NVARCHAR(MAX); --过滤sql
DECLARE @coungtSql NVARCHAR(MAX);--总记录数sql
SET @pageIndex='';
SET @whereSql='';
SET @totalCount='';
SET @coungtSql='';

IF @where <>''
BEGIN 
	SET @whereSql=' WHERE ('+ @where +')';
END

IF @pageIndex<=0
BEGIN
	SET @pageIndex=1;
END 

IF @pageSize<=0
BEGIN 
	SET @pageSize=10;
END 

SET @coungtSql='SELECT COUNT(*) FROM '+ @tableName +' WHERE '+@where;

exec sp_executesql @coungtSql,N'@Count INT OUTPUT', @totalCount OUTPUT

SET @pageSql='SELECT *  FROM ( SELECT ROW_NUMBER() OVER (ORDER BY '+ @orderSql +') pageIndex, * FROM '+ @tableName +@whereSql+' ) t_page WHERE pageIndex > '
+ CONVERT(VARCHAR,@pageIndex) +' AND pageIndex <= '+CONVERT(VARCHAR,@pageSize);

EXEC(@pageSql)
GO

DECLARE @Count INT ;
EXEC SP_K_PAGE @Count OUTPUT,'COURSE','Cource_Name','CreateTime < GETDATE()'

我怀念那夕阳下的奔跑,那是我逝去的青葱!结束。

posted @ 2016-06-30 17:52  Khadron  阅读(221)  评论(0编辑  收藏  举报