存储过程,非常重要
----------------常用的系统存储过程---------------
execute sp_databases--查看服务器里的所有数据库
exec sp_renamedb NetBarDB,abc--重命名数据库
exec sp_tables--查询出当前环境下的对象列表
exec sp_columns cardInfo--查询指定表中列的信息
------------存储过程语法------------------
create procedure 存储过程名称 --procedure可以用proc代替
@参数1 数据类型=默认值 output,--output表示输出参数,注意:定义存储过程参数不需要declare
@参数2 数据类型, --没output表示输入参数
.......
as
--存储过程主体部分(T-SQL语句)
go
--------------简单查询的存储过程--------------------
create proc proc_selectPCinfo
as
select * from PCInfo
go
exec proc_selectPCinfo --执行存储过程
--------------无参的存储过程--------------------------
--完成:PCuse=0的计算机信息
create proc proc_selectPCinfo2
as
select * from PCInfo where PCUse=0
go
exec proc_selectPCinfo2
-----------------带输入参数的存储过程------------------
--完成:根据参数值来查询不同状态的计算机信息
create proc proc_selectPCinfoByPCuse
@PCuse int
as
select *,
case
when PCUse=0 then '空闲'
when PCUse=1 then '正在使用'
end as 使用状态
from PCInfo where PCUse=@PCuse
go
--执行带参数的存储过程(建议使用第二种)
exec proc_selectPCinfoByPCuse 1
exec proc_selectPCinfoByPCuse @PCuse=1
--注意:
exec proc_selectPCinfoByPCuse --出错,因为没提供参数值
-------------------输入参数有默认值的存储过程-----------------------
--特点:当调用存储过程没有提供参数值时,参数会使用默认值
--完成:改写上面的存储过程,当执行存储过程没提供参数值,就会查询空闲状态的计算机信息
create proc proc_selectPCinfoByPCuseHasDefault
@PCuse int=0 --有默认值的参数
as
select *,
case
when PCUse=0 then '空闲'
when PCUse=1 then '正在使用'
end as 使用状态
from PCInfo where PCUse=@PCuse
go
exec proc_selectPCinfoByPCuseHasDefault --查PCuse为0(没提供参数值就使用默认值)
exec proc_selectPCinfoByPCuseHasDefault 1 --查PCuse为1
-------------带输出参数的存储过程------------------
--完成:根据卡号查余额,然后判断是否能上机
create proc proc_getBalanceByCardNumber
@CardNum varchar(20),
@balance int output--输出参数
as
select @balance=CardBalance from cardInfo where CardNumber=@CardNum
go
--调用带输出参数的存储过程
declare @money int
exec proc_getBalanceByCardNumber @CardNum='023-001',@balance=@money output --调用存储过程时,输出参数一定要加output
if(@money>=2)
begin
print '可以上机'
end
else
begin
print '余额不足2元,请先充值'
end
--删除存储过程
if exists(select * from sysobjects where name='proc_getBalanceByCardNumber')
begin
drop proc proc_getBalanceByCardNumber
end
--------------------return的使用-----------------------
--完成:获取新增电脑的编号
--方法一:使用输出参数
if exists(select * from sysobjects where name='proc_getAddPCid')
begin
drop proc proc_getAddPCid
end
go
create proc proc_getAddPCid
@pcid int output
as
insert into PCInfo values(0,'新增的计算机')
set @pcid=@@IDENTITY
go
declare @id int
exec proc_getAddPCid @pcid=@id output
print convert(varchar,@id)
--方法二:使用return
if exists(select * from sysobjects where name='proc_getAddPCid')
begin
drop proc proc_getAddPCid
end
go
create proc proc_getAddPCid
as
insert into PCInfo values(0,'新增的计算机')
return @@identity
go
declare @id int
exec @id=proc_getAddPCid
print convert(varchar,@id)
--注意:使用return只能返回一个结果,使用输出参数可以返回多个结果
-----------------return---------------------
--完成:充值
if exists(select * from sysobjects where name='proc_addBalance')
begin
drop proc proc_addBalance
end
go
create proc proc_addBalance
@cardNum nvarchar(50),
@cardBalance int
as
if not exists(select * from cardInfo where CardNumber=@cardNum)
begin
print '卡号不存在!'
return
end
if(@cardBalance<=0)
begin
print '充值金额不大于0,无法充值!'
return
end
update cardInfo set CardBalance=CardBalance+@cardBalance
where CardNumber=@cardNum
declare @errorNum int--声明一个变量,存储错误值,用来判断sql语句是否执行成功
set @errorNum=0
set @errorNum = @@ERROR
if(@errorNum>0)
begin
print '充值失败!'
end
else
begin
print '充值成功!'
end
go
exec proc_addBalance @cardNum='023-001',@cardBalance=10
----------------raiserror的使用-----------------------
--完成:完善上例
if exists(select * from sysobjects where name='proc_addBalance')
begin
drop proc proc_addBalance
end
go
create proc proc_addBalance
@cardNum nvarchar(50),
@cardBalance int
as
if not exists(select * from cardInfo where CardNumber=@cardNum)
begin
raiserror('卡号不存在!',16,1) with log--with log用于将错误写入系统日志中(我的电脑->管理->系统工具->事件查看器->Windows日志->应用程序)
print convert(varchar,@@error)--输出50000,原因:@@error的值会受raiserror的影响
return
end
if(@cardBalance<=0)
begin
raiserror('充值金额不大于0,无法充值!',16,1)
return
end
update cardInfo set CardBalance=CardBalance+@cardBalance
where CardNumber=@cardNum
declare @errorNum int--声明一个变量,存储错误值,用来判断sql语句是否执行成功
set @errorNum=0
set @errorNum = @@ERROR
if(@errorNum>0)
begin
raiserror('充值失败!',16,1)
end
else
begin
raiserror('充值成功!',11,1)
end
go
exec proc_addBalance @cardNum='023-101',@cardBalance=10