初入Sql Server 之 存储过程的简单使用

打印 上一主题 下一主题

主题 550|帖子 550|积分 1650

一、简介

简单记录一下存储过程的使用。存储过程是预编译SQL语句集合,也可以包含一些逻辑语句,而且当第一次调用存储过程时,被调用的存储过程会放在缓存中,当再次执行时,则不需要编译可以立马执行,使得其执行速度会非常快。
二、使用

创建格式    create procedure 过程名( 变量名     变量类型 ) as    begin   ........    end 
  1. create procedure getGroup(@salary int)
  2. as
  3. begin
  4.    SELECT d_id AS '部门编号', AVG(e_salary) AS '部门平均工资' FROM employee
  5.   GROUP BY d_id
  6.   HAVING AVG(e_salary) > @salary
  7. end     
复制代码
调用时格式,exec 过程名  参数
  1. exec getGroup 7000
复制代码
三、在存储过程中实现分页

3.1 要实现分页,首先要知道实现的原理,其实就是查询一个表中的前几条数据
  1. select top 10 * from table  --查询表前10条数据
  2. select top 10 * from table where id not in (select top (10) id  from tb) --查询前10条数据  (条件是id 不属于table 前10的数据中)
复制代码
3.2 当查询第三页时,肯定不需要前20 条数据,则可以
  1. select top 10 * from table where id not in (select top ((3-1) * 10) id  from tb) --查询前10条数据  (条件是id 不属于table 前10的数据中)
复制代码
3.3 将可变数字参数化,写成存储过程如下
  1. create proc sp_pager
  2. (
  3.     @size int , --每页大小
  4.     @index int --当前页码
  5. )
  6. as
  7. begin
  8.     declare @sql nvarchar(1000)
  9.     if(@index = 1)
  10.         set @sql = 'select top ' + cast(@size as nvarchar(20)) + ' * from tb'
  11.     else
  12.         set @sql = 'select top ' + cast(@size as nvarchar(20)) + ' * from tb where id not in( select top '+cast((@index-1)*@size as nvarchar(50))+' id  from tb )'
  13.     execute(@sql)
  14. end
复制代码
 3.4 当前的这种写法,要求id必须连续递增,所以有一定的弊端
所以可以使用 row_number(),使用select语句进行查询时,会为每一行进行编号,编号从1开始,使用时必须要使用order by 根据某个字段预排序,还可以使用partition by 将 from 子句生成的结果集划入应用了 row_number 函数的分区,类似于分组排序,写成存储过程如下
  1. create proc sp_pager
  2. (
  3.     @size int,
  4.     @index int
  5. )
  6. as
  7. begin
  8.     select * from ( select row_number() over(order by id ) as [rowId], * from table) as b
  9.     where [rowId] between @size*(@index-1)+1  and @size*@index
  10. end
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表