• SQL:存储过程


    1/什么是存储过程及概念

      Transact-SQL中的存储过程,非常类似于.Net语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。

      存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。 

      通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句;相当于.Net中自己封装好的方法,需要的时候调用;

      Ø 存储过程的概念

         存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。

         存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。

         由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。

      

    2存储过程的优点

            A、 存储过程允许标准组件式编程

            存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。

            B、 存储过程能够实现较快的执行速度

            如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。

            C、 存储过程减轻网络流量

            对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。

            D、 存储过程可被作为一种安全机制来充分利用

            系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。

      总结:

         1:存储过程就像方法一样,可以重复使用,这也无形之中提高了开发的效率;(开发效率高

         2:因为存储过程是预编译的,在存储过程首次运行的时候,查询优化器会对其分析和优化,并把最终的存储计划存在系统表中,而SQL语句,每次每次运行都要预编译和优化,所以呢速度会比存储过程慢一些;(运行速度快

         3:因为sql语句都是在网络中传输的,如果写一个查询十个表或者更多更复杂的操作,这个产生的字符串是庞大的。 如果用存储过程,只需要调用存储过程的名字就行了,这也是减轻网络流量,降低网络负载

         4:安全性高

    Ø 系统存储过程

        系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程。尽管这些系统存储过程在master数据库中,但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。

    常用系统存储过程:

    exec sp_databases; --查看数据库
    exec sp_tables;        --查看表
    exec sp_columns student;--查看列
    exec sp_helpIndex student;--查看索引
    exec sp_helpConstraint student;--约束
    exec sp_stored_procedures;
    exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句
    exec sp_rename student, stuInfo;--修改表、索引、列的名称
    exec sp_renamedb myTempDB, myDB;--更改数据库名称
    exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库
    exec sp_helpdb;--数据库帮助,查询数据库信息
    exec sp_helpdb master;
    常用系统存储过程
    --表重命名
    exec sp_rename 'stu', 'stud';
    select * from stud;
    --列重命名
    exec sp_rename 'stud.name', 'sName', 'column';
    exec sp_help 'stud';
    --重命名索引
    exec sp_rename N'student.idx_cid', N'idx_cidd', N'index';
    exec sp_help 'student';
    
    --查询所有存储过程
    select * from sys.objects where type = 'P';
    select * from sys.objects where type_desc like '%pro%' and name like 'sp%';
    系统存储过程示例:

    Ø 用户自定义存储过程

       1、 创建语法

    create proc | procedure pro_name
        [{@参数数据类型} [=默认值] [output],
         {@参数数据类型} [=默认值] [output],
         ....
        ]
    as
        SQL_statements

      2、创建不带参数的存储过程

    Create Proc proc_UserInfoSelect
    as 
    begin 
    Select * From UserInfo
    end 
    --调用、执行存储过程
    exec SelectUserInfo

      3、修改存储过程

    --语法
    alter Proc 存储过程名字
    as
    begin
        要执行的语句…………
    end
    
    --查询ID=1的数据
    alter Proc proc_UserInfoSelect
    as
    begin
        Select * From UserInfo Where ID=1;
    end

      4、删除存储过程

     --关键字   关键字    存储过程的名字
      drop  procedure  proc_UserInfoSelect

      5、创建有参数的存储过程

    --分页查询数据
    Create proc proc_UserInfoByPagingSelect(
        @pageIndex int,    --当前页
        @pageSize int,    --每页显示N条数据
        @count int output    --一共多少条数据,返回的值
    )as
    begin 
     Set @count=(Select COUNT(*) From UserInfo);
     Select * From (Select *, ROW_NUMBER() over(order by ID) as num From userinfo) as t
     Where t.num between (@pageIndex-1)*@pageSize+1 and @pageIndex*@pageSize;
    end

      6、不缓存存储过程

    Create proc proc_usersss
    with recompile
    as
    begin
    Select * From UserInfo;
    end

       7、 加密存储过程

    Create proc proc_userInfoSelect
    with encryption
    as 
    begin 
    select * from UserInfo;
    end
    
    exec sp_helptext 'proc_usersss'
    exec sp_helptext 'proc_userInfoSelect'

        8、 带游标参数存储过程

    --创建
    create proc proc_myCus
    @proCur cursor varying output
    as
    begin
        set @proCur=cursor forward_only static for
            select id,uname,upwd from userinfo
        open @proCur
    end 
    
    
    --调用
    declare @exc_proc cursor
    declare @ID varchar(32);
    declare @name varchar(32);
    declare @pwd varchar(32);
    exec proc_myCus @exc_proc output
    Fetch Next From @exc_proc INTO @ID,@name,@pwd
    while(@@FETCH_STATUS=0)
    begin
        Fetch Next From @exc_proc INTO @ID,@name,@pwd
        print @ID+'  '+@name+'  '+@pwd;
  • 相关阅读:
    小菜编程成长记(四 业务的封装)
    小菜学Flex2(二 currentState初步使用)
    小菜编程成长记(九 反射——程序员的快乐!)
    小菜编程成长记(一 面试受挫——代码无错就是好?)
    小菜编程成长记(六 关于Flex的争论)
    小菜编程成长记(三 复制VS复用)
    104种木马的清除方法
    细节决定成败打电话和发邮件的细节
    MS SQL Server查询优化方法
    美国西点军校最重要的行为准则:没有任何借口
  • 原文地址:https://www.cnblogs.com/songyaqi/p/4612989.html
Copyright © 2020-2023  润新知