存储过程
--1.简化代码,减少网络流通量,只需要传输存储过程名称,不需要过长的SQL语句
--2.带参数,防止SQL注入攻击,与带参数的sql语句一样的效果,带参数的sql语句其实调用的就是sp_executesql存储过程
--3.存储过程是在数据库中已经预编译过的,效率会比较高
--系统存储过程
--由系统定义,存储在master数据库中
exec sp_databases --列出数据库中所有的数据库
exec sp_helpdb --报告指定数据库或者所有数据库的信息
exec sp_tables --返回当前环境下可查询对象的列表
exec sp_columns 'NIS_ADDINS' --返回某个表列的信息
exec sp_help 'NIS_ADDINS' --查看某个表的所有信息
exec sp_helpconstraint 'NIS_ADDINS' --查看某个表的约束
exec sp_helpindex 'NIS_ADDINS' --查看某个表的索引
exec sp_stored_procedures --列出当前环境中的所有存储过程
exec sp_helptext 'sp_helptext' --显示默认值,未加密的存储过程,用户定义的存储过程,触发器,或视图的实际文本
sp_password --添加或修改登录账户的密码
sp_renamedb --更改数据库的名称
--自定义存储过程
--是我们在编程中根据需要自定义的存储过程
--系统存储过程名称以sp_开头,自定义的存储过程使用usp_开头
--存储过程的定义语法
create proc [存储过程名称]
--接下来是参数定义,如果没有参数,可以省略
@name varchar(64),
@id int
as --as必须带
begin
--数据操作sql
end
--创建一个存储过程,查询菜单信息
create proc usp_addins
@id varchar(64) --菜单的ID
as
begin
if(@id='')
begin
select * from NIS_ADDINS
end
else
begin
select * from NIS_ADDINS WHERE ID =@id
end
end
--调用
exec usp_addins ''
exec usp_addins '0223D9CB-8725-4B7D-8E05-FC41FBC2F0AD'
--创建一个执行加操作的存储过程
create procedure usp_add
@num1 int,
@num2 int
as
begin
select @num1+@num2
end
--调用存储过程
--可以指定参数为其赋值
exec usp_add @num1=100,@num2=200
--也可以根据参数的顺序赋值
exec usp_add 100,200
--创建存储过程的时候,也可以为参数设置默认值
--先删除执行加操作的存储过程
--drop proc usp_add
--有默认值的存储过程
alter proc usp_add
--设置参数,并且为参数设置默认值
@num1 int=200,
@num2 int=300
as
begin
select @num1+@num2
end
--调用存储过程,设置默认参数之后也可以像普通的存储过程调用一样传递参数
exec usp_add 900,900
--也可以不为默认参数传值,如果所有参数都有默认值,在调用存储过程的时候可以不传递参数
exec usp_add
exec usp_add 900
exec usp_add @num2=900
--如果有参数有默认值,有些参数没有默认值,在创建的时候要注意参数的顺序,在调用的时候也要注意传值的顺序,或者干脆直接知名参数然后传值
--最好把有默认值的参数放到后面,否则在调用的时候一定要注意传值的顺序
--示例1
alter proc usp_add
--第一个没有默认值,第二个有默认值
@num1 int,
@num2 int=300
as
begin
select @num1+@num2
end
--调用如下
exec usp_add 900
exec usp_add 900,900
exec usp_add @num1=900
--示例2
alter proc usp_add
--第一个有默认值,第二个没有默认值
@num1 int=200,
@num2 int
as
begin
select @num1+@num2
end
--调用存储过程
--要么所有参数都传值,要么指定传值的参数名称
exec usp_add 900,900
exec usp_add @num2=900
--如下的调用会出错,他会默认把第一个值传递给第一个参数,导致第二个没有默认值的参数没有传值
exec usp_add 900
--创建带输出参数的存储过程
--根据班级Id查询学生信息并同时返回一个查询到的记录的条数
create proc usp_selectStuInfoByClsId
@classId int, --学生ID
@recordCount int output --输出参数
as
begin
select * from TblStudent where tsclassId=@classId
select @recordCount=count(*) from TblStudent where tsclassId=@classId
end
--调用存储过程方式如下
declare @rc int
exec usp_selectStuInfoByClsId @classId=5,@recordCount=@rc output
print @rc
--实现分页的存储过程
create proc usp_getAddinsByPage
@pageSize int, --每页的记录条数
@pageIndex int, --用户当前要查看第几页
@pageCount int output --输出参数,返回总共有几页
as
begin
--查询NIS_ADDINS表的记录
select * from
(
--先根据规则查询出所有数据并且编号
select
*,
Rn=row_number() over(order by ZYMC asc)
from NIS_ADDINS
) as addins
--返回从(当前页-1)*每页条数 然后在+1,到当前页*每页条数
where addins.Rn between (@pageIndex-1)*@pageSize+1 and @pageIndex*@pageSize
--返回总页数
--1.先计算总记录条数
declare @rdCount int
select @rdCount=count(*) from NIS_ADDINS
--2.计算页数,ceiling函数取上限,只入不舍
set @pageCount=ceiling(@rdCount/(@pageSize*1.0))
end
--调用存储过程
declare @pc int
exec usp_getAddinsByPage @pageSize=5,@pageIndex=19, @pageCount=@pc output
print @pc
--ceiling函数向上取整数
declare @mm int
set @mm=ceiling(11/(5*1.0))
print @mm
--增加数据的存储过程
create proc usp_insertToPerson
@uname nvarchar(50),
@uage int,
@uheight int
as
begin
--执行完成之后返回新增数据的ID
insert into TblPerson output inserted.autoId values(@uname,@uage,@uheight)
end
--调用新增的存储过程
usp_insertToPerson '杨鹏立',18,180
--删除数据的存储过程
create proc usp_deletePerson
@autoId int
as
begin
delete from TblPerson where autoId=@autoId
end
--更新数据的存储过程
create proc usp_updatePerson
@autoId int,
@uname nvarchar(50),
@uage int,
@uheight int
as
begin
update TblPerson set uname=@uname,uage=@uage,uheight=@uheight where autoId=@autoId
end
--查询数据的存储过程
create proc usp_selectAllPerson
as
begin
select * from TblPerson
end
--关于order by排序
--一般情况可以使用如下的方式
select * from NIS_ADDINS order by ID asc
--还有一种方式如下,order by 后面的2表示按照返回值的第二列进行升序排列
select * from NIS_ADDINS order by 2 asc