存储过程,非常重要

----------------常用的系统存储过程---------------
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

你可能感兴趣的:(存储过程)