zoukankan      html  css  js  c++  java
  • 存储过程,非常重要

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

  • 相关阅读:
    C#中的多态
    一个JQUERY文件
    等比例缩放图片
    WIN7 环境下 VS2012 打开某些解决方案项目 提示 【已停止工作】 解决办法
    统计字符串中字符出现的次数
    LINQ关联表查询语法和.NET扩展方法和JSON.NET时间格式化代码段
    EasyUI表格datagrid合并行单元格
    一个导出Excel的类
    一个缩略图的类
    分布式缓存MemCache
  • 原文地址:https://www.cnblogs.com/danmao/p/3870802.html
Copyright © 2011-2022 走看看