存储过程——分页功能及触发器(八)
- 实现分页功能
- 要求取出表A中第31到40条的记录(第4页信息),sql server以自动增长的ID作为主键,注意ID不能是连续的
答案
select top 10 * form A where id not in(select top 30 id from A)
那通过存储过程怎样去实现通用的分页功能的
分析
- 转递参数,表名,页码,页面数据展示大小,主键列名
以下雏形便产生了
-- ============================================= -- Author: <Author,,Name> -- Create date: 2014年4月13日 00:36:24 -- Description: 分页功能 -- ============================================= CREATE PROCEDURE GetDataByPageNo @tablename nvarchar(100),--表名 @pagesize int,--页大小 @pageno int,--页码 @columns nvarchar(50)--按列排序 AS BEGIN DECLARE @sql nvarchar(1000) SET @sql='select top '+CAST(@pagesize as nvarchar(10))+' * from '+@tablename+ ' where '+ @columns +' not in (select top '+CAST((@pageno-1)*@pagesize as nvarchar(10))+' '+@columns+' from '+ @tablename+' )' EXEC(@Sql) END
- 触发器
- 触发器简介
触发器是一种DBMS相应特殊表或增、删、改操作的特殊类型的存储过程
2. 触发器语法
具体应用如下
- 要求,流水账号实现
流水帐号格式:20140413000000、20140413000000
给产品表添加触发器
通过存储过程添加数据实现存触发器,修改表字段
2. 具体操作如下
分析:
流水号格式,当期日期+最大id号六位数字组成
代码如下
-- Author: <Author,,Name> -- Create date: 2014年4月13日 11:39:48 -- Description: 生成流水号 -- ============================================= CREATE TRIGGER [dbo].[SetProNO] ON [dbo].[product]--操作表 AFTER INSERT--具体操作,执行什么操作触发 AS BEGIN DECLARE @year nvarchar(10) DECLARE @mouth nvarchar(10) DECLARE @day nvarchar(10) DECLARE @id nvarchar(50) DECLARE @No nvarchar(50) DECLARE @str nvarchar(10) SET @year=Datename(yyyy,getdate()) SET @mouth=Datename(mm,getdate()) SET @day=Datename(dd,getdate()) SET @str='000000' SELECT @id=MAX(ID) FROM [dbo].[product] SET @No=@year+@mouth+@day+RIGHT(@str+@id,6) UPDATE product SET No=@No where id=@id END
调用下面存储过程,直接触发上述触发器
-- ============================================= -- Author: <Author,,Name> -- Create date: 2014年4月13日 12:03:13 -- Description: 产品信息添加 -- ============================================= CREATE PROCEDURE [dbo].[Addproduct] @Name nvarchar(50), @Price money, @address nvarchar(50), @type int AS BEGIN INSERT product ( Name, Price, Address, Type ) VALUES ( @Name, @Price, @Address, @type ) END