存储过程

2018.09.13

星期四

存储过程

        定义:

              存储过程类似于C#中的函数或JAVA中的方法,主要用来执行管理任务或

              应用复杂的业务规则,不仅可以带参数还可以返回结果。

              它可以包含数据操纵语句,变量,逻辑控制语句等。

        优点:

             1.允许模块化程序设计

                一次创建多次使用,并可独立于程序源代码而单独修改。

             2.执行速度更快

             3.减少网络流通量

                一个需要数百行的T-SQL代码的操作可以由一条存储过程实现。

             4.提高系统安全性

                存储过程的定义文本可被加密,使用户不能查看其内容。

                可将存储过程作为用户取存数据的管道,取代原有数据表操作。

        分类:

            系统存储过程:

    EXEC sp_databases        --列出当前系统中的数据库
    EXEC sp_renamedb 'student','students'    --修改数据库的名称(单用户访问)
    USE students    --修改当前数据库
    GO
    EXEC sp_tables        --当前数据库中查询的对象的列表
    EXEC sp_columns stuInfo        --返回某个表的列的信息
    EXEC sp_help stuInfo        --查看表stuInfo的信息
    EXEC sp_helpconstraint stuInfo        --查看表stuInfo的约束
    EXEC sp_helpindex stuMarks            --查看表stuMarks的索引
    EXEC sp_helptext 'view_stuInfo_stuMarks'    --查看视图的语句文本
    EXEC sp_stored_procedures        --查看当前数据库中的存储过程

    --解决错误(2008数据库cmd不能执行时候解决方案)
    EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
    EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

    EXEC xp_cmdshell 'mkdir d:\Back',NO_OUTPUT        --创建文件夹
    EXEC xp_cmdshell 'dir d:\Back'                    --显示文件夹信息
    EXEC xp_cmdshell 'del d:\Back'                --删除一个或数个文件

            自定义存储过程 :

             语法:

              create  proc[存储过程名]

                                   [@参数  数据类型[=默认值  output],

                                   @参数n  数据类型[=默认值  output]]

              as

                                   T-SQL语句

              go

             调用:

              exec/execute   存储过程名  [参数]

             创建不带参数的存储过程:

             示例:

    IF EXISTS (SELECT * FROM sys.procedures WHERE NAME='Proc_GetAllStuMark')
        DROP PROC Proc_GetAllStuMark
    GO
        
    CREATE PROC Proc_GetAllStuMark
    AS
        SELECT a.stuid,a.StuName, b.Subject, b.Score
        FROM StuInfo a, StuMarks b
        WHERE a.StuID=b.StuID
    GO
    
    --执行存储过程
    EXEC Proc_GetAllStuMark
    EXECUTE Proc_GetAllStuMark   

             创建带有参数的存储过程:      

             输入参数:用于向存储过程传入值,类似C#语言的按值传递;

             输出参数:用于在调用存储过程后,返回结果,类似C#语言的按引用传递;

             示例:

    --根据学生姓名,获得学生成绩
    IF EXISTS (SELECT * FROM sys.procedures WHERE NAME='Proc_GetStuMarkByStuName')
        DROP PROC Proc_GetStuMarkByStuName
    GO
    
    CREATE PROC Proc_GetStuMarkByStuName @stuname VARCHAR(20)
    AS
        SELECT a.StuName, b.Subject, b.Score
        FROM StuInfo a, StuMarks b
        WHERE a.StuID=b.StuID
        AND a.StuName=@stuname
    GO

    EXEC Proc_GetStuMarkByStuName '李四'

             创建参数有默认值的存储过程:

             示例:

    --添加学生信息表的数据
    IF EXISTS (SELECT * FROM sys.procedures WHERE NAME='Proc_InsertStuInfo')
        DROP PROC  Proc_InsertStuInfo
    GO
    
    CREATE PROC Proc_InsertStuInfo @stuname varchar(20),@stusex char(2) = '男'
    AS
        INSERT INTO StuInfo (StuName, StuSex)
        VALUES (@stuname, @stusex)
    GO
    
    --调用参数有默认值的存储过程
    EXEC Proc_InsertStuInfo '唐僧'
    EXEC Proc_InsertStuInfo '白骨精','女'

             创建带输出类型参数的存储过程:

             注意:

              输出参数,必须使用变量。

              如果要获得输出参数的值,那么在调用时,必须说明该参数为输出参数。

              输出参数同时也是输入参数,调用时,也可以给参数赋值。

              如果参数中包含有输出参数,其他参数将不能使用默认值,调用时必须赋值。

             示例:

    --根据学生姓名查找学员SQL分数
    IF EXISTS (SELECT * FROM sys.procedures WHERE NAME='Proc_GetCMarkByStuName')
        DROP PROC Proc_GetCMarkByStuName
    GO
    
    CREATE PROC Proc_GetCMarkByStuName @stuname VARCHAR(20),@cmark int OUTPUT
    AS
        SELECT @cmark = b.Score FROM StuInfo a, StuMarks b
        WHERE a.StuID = b.StuID
        AND b.Subject = 'SQL' AND a.StuName = @stuname
    GO
    
    --调用该存储过程
    DECLARE @cmark INT
    EXEC Proc_GetCMarkByStuName '李四', @cmark OUTPUT
    PRINT '李四的SQL分数为:' + CONVERT(VARCHAR, @cmark)

 

        异常:

            raiserror语句:

               可指定严重级别;

               设置系统变量@@error;

               记录所发生的错误等。

            语法:

               raiserror (错误消息, 严重级别(0—18), 状态(1—127))

            示例:

    IF EXISTS (SELECT * FROM sys.procedures WHERE NAME='Proc_Devide')
        DROP PROC Proc_Devide
    GO
    
    CREATE PROC Proc_Devide @a int, @b int
    AS
        DECLARE @c INT
        IF (@b = 0)
            BEGIN
                RAISERROR ('以零作除数错误', 15, 2)
                RETURN
            END
        SET @c = @a / @b
    GO

    EXEC Proc_Devide 10, 0

    print '错误编号' + CONVERT(VARCHAR, @@ERROR)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值