我理解为把1个表或者多个表关联的数据,封装起来,调用改变数据,哪些表的数据也会改变。用起来方便。
存储过程优点:
(1)执行速度快
(2)效率高
(3)安全性
(4)模块化编程
分类:
系统存储过程:sp_xxxxx
扩展存储过程:xp_xxxxx
用户自定义存储过程:
系统存储过程
--列出服务器上所有的数据库
exec sp_databases --无参数的
--更改数据库名称
exec sp_renamedb 'stuDB','StudentDB' --带参数的,把stuDB数据库名改为StudentDB。
--查看某个表的信息:参数可选
exec sp_help
exec sp_help 'PCInfo'
使用数据库运行系统DOS命令:
--打开xp_cmdshell命令 ,服务系统默认关闭状态所以也要打开。
exec sp_configure 'show advanced options', 1
reconfigure
go
--开启xp_cmdshell服务
exec sp_configure 'xp_cmdshell', 1 --1不是打开,0表示关闭
reconfigure
go
--调用dos命令创建文件夹:不打开服务直接运行这一句会报错。为了防止黑客入侵,默认关闭状态。
exec xp_cmdshell 'md E:\zuxia' --这里可以随意输入dos命令。
-- 禁用xp_cmdshell服务
exec sp_configure 'xp_cmdshell', 0
reconfigure
go
自定义存储过程:
程序员根据自己的需要来定义的
语法:
create procedure(proc) proc_名称
形参..........
as
相关代码............................
go
调用:exec 过程名称 实数........也是传参
创建两个表做演示
create database NetBarDB --创建数据库create database 数据库名
go --批处理(批量处理)
use NetBarDB --打开数据库
go
create table PCInfo --创建表:create table 表名
(
PCid int primary key identity,
PCname char(10), --姓名
)
create table cardInfo --创建表:create table 表名
(
cardid int primary key identity,
cardsex char(2), --性别
cardage int --年龄
)
insert into PCInfo values('张三'),('李四'),('王五')
insert into cardInfo values('男',18),('女',20),('女',19)
无参
if exists(select * from sys.objects where name='proc_getstuinfo')
begin
drop proc proc_getstuinfo --如果存在就删除。才能创建
end
go
create proc proc_getstuinfo
--这里是无参
as
select PCInfo.PCId as 学号,
PCInfo.PCname as 姓名,
cardsex as 性别,
cardage as 密码
from PCInfo inner join cardInfo on PCInfo.PCId=cardInfo.cardid
go
--调用存储过程:有参数就带参数,下面这个是无参
exec proc_getstuinfo
有参
if exists(select * from sys.objects where name='proc_PCU')
begin
drop proc proc_PCU
end
go --go是批量处理,下面才不报错
create proc proc_PCU
@PCname varchar(20), --参数
@sex varchar(2) --第二个参数,以此类推,看自己需求
as
select PCInfo.PCId as 学号,
PCInfo.PCname as 姓名,
cardsex as 性别,
cardage as 密码
from PCInfo inner join cardInfo on PCInfo.PCId=cardInfo.cardid where PCname=@PCname and cardsex=@sex
go
--调用:
exec proc_PCU '张三','男'
案例
if exists(select * from sys.objects where name='proc_insertStuMarks')
begin
drop proc proc_insertStuMarks
end
go
create proc proc_insertStuMarks
@PCname varchar(20),
@cardsex char(2),
@cardage int,
@num int output
as
--判断:用户存在的情况
if exists(select * from PCInfo where PCname=@PCname)
begin
raiserror('用户已经存在!',16,20) --raiserror('错误消息',错误级别,错误号)错误级别:0-18,错误号:1-127
return
end
--判断:笔试成绩
if(@cardage>100 or @cardage<0)
begin
raiserror('年龄只能在0-100之间!!',16,20)
return
end
--插入
insert into PCInfo values(@PCname)
insert into cardInfo values(@cardsex,@cardage)
set @num=@@rowcount --返回受影响行数
go
--调用:
declare @n int
exec proc_insertStuMarks '赵六','女',90,@n output --output用来指定参数是输出型参数
if(@n = 1)
begin
print '添加成功'
end
else
begin
print '添加失败'
end
go
select * from PCInfo inner join cardInfo on PCId=cardid