我理解为把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