[var]
简单记录一下存储进程的使用。存储进程是预编译SQL语句集合,也能够包括一些逻辑语句,而且当第一次调用存储进程时,被调用的存储进程会放在缓存中,当再次履行时,则不需要编译可以立马履行,使得其履行速度会非常快。
[var]
创建格式 create procedure 进程名( 变量名 变量类型 ) as begin …….. end
create procedure getGroup(@salary int)
as
begin
SELECT d_id AS ‘部门编号’, AVG(e_salary) AS ‘部门平均工资’ FROM employee
GROUP BY d_id
HAVING AVG(e_salary) > @salary
end
as
begin
SELECT d_id AS ‘部门编号’, AVG(e_salary) AS ‘部门平均工资’ FROM employee
GROUP BY d_id
HAVING AVG(e_salary) > @salary
end
调用时格式,exec 进程名 参数
exec getGroup 7000
[var]
3.1 要实现分页,首先要知道实现的原理,其实就是查询一个表中的前几条数据
select top 10 * from table –查询表前10条数据
select top 10 * from table where id not in (select top (10) id from tb) –查询前10条数据 (条件是id 不属于table 前10的数据中)
select top 10 * from table where id not in (select top (10) id from tb) –查询前10条数据 (条件是id 不属于table 前10的数据中)
3.2 当查询第三页时,肯定不需要前20 条数据,则可以
select top 10 * from table where id not in (select top ((3⑴) * 10) id from tb) –查询前10条数据 (条件是id 不属于table 前10的数据中)
3.3 将可变数字参数化,写成存储进程以下
create proc sp_pager
(
@size int , –每页大小
@index int –当前页码
)
as
begin
declare @sql nvarchar(1000)
if(@index = 1)
set @sql = ‘select top ‘ + cast(@size as nvarchar(20)) + ‘ * from tb’
else
set @sql = ‘select top ‘ + cast(@size as nvarchar(20)) + ‘ * from tb where id not in( select top ‘+cast((@index⑴)*@size as nvarchar(50))+’ id from tb )’
execute(@sql)
end
(
@size int , –每页大小
@index int –当前页码
)
as
begin
declare @sql nvarchar(1000)
if(@index = 1)
set @sql = ‘select top ‘ + cast(@size as nvarchar(20)) + ‘ * from tb’
else
set @sql = ‘select top ‘ + cast(@size as nvarchar(20)) + ‘ * from tb where id not in( select top ‘+cast((@index⑴)*@size as nvarchar(50))+’ id from tb )’
execute(@sql)
end
3.4 当前的这类写法,要求id一定要连续递增,所以有一定的弊端
所以可使用 row_number(),使用select语句进行查询时,会为每行进行编号,编号从1开始,使用时一定要要使用order by 根据某个字段预排序,还可使用partition by 将 from 子句生成的结果集划入利用了 row_number 函数的分区,类似于分组排序,写成存储进程以下
create proc sp_pager
(
@size int,
@index int
)
as
begin
select * from ( select row_number() over(order by id ) as [rowId], * from table) as b
where [rowId] between @size*(@index⑴)+1 and @size*@index
end
(
@size int,
@index int
)
as
begin
select * from ( select row_number() over(order by id ) as [rowId], * from table) as b
where [rowId] between @size*(@index⑴)+1 and @size*@index
end
到此这篇关于分享Sql Server 存储进程使用方法的文章就介绍到这了,更多相关Sql Server 存储进程内容请搜索之前的文章或继续浏览下面的相关文章希望大家以后多多支持!
本文来源:https://www.yuntue.com/post/150466.html | 云服务器网,转载请注明出处!