• SQL 之存储过程


    • 存储过程
      • 是用来执行管理任务或应用复杂的业务规则,
      • 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
    • 存储过程的优点
      • 存储过程已在服务器注册
      • 执行速度更快
      • 允许模块化程序设计
      • 提高系统安全性 减少网络流通量    
    • 系统存储过程
      1.  由系统定义,存放在master数据库中
      2.  系统存储过程的名称都以“sp_”开头或“xp_”开头
    • 常见的系统存储过程

     

    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;
    •  扩充存储过程
      •  可以执行DOS命令下的一些的操作
      •  以文本行方式返回任何输出
      •  调用语法: EXEC xp_cmdshell DOS命令 [NO_OUTPUT]
      •  启动方法:
         EXEC sp_configure 'show advanced options', 1
        GO
        RECONFIGURE
        GO
        EXEC sp_configure 'xp_cmdshell', 1
        GO
        RECONFIGURE
        GO 
      • 示例:
        /*创建数据库bankDB,要求保存在D:ank
        */
        
        USE master
        GO
        EXEC xp_cmdshell 'mkdir d:ank', NO_OUTPUT
        IF EXISTS(SELECT * FROM sysdatabases
                                    WHERE name='bankDB')
           DROP DATABASE bankDB
        GO
        CREATE DATABASE bankDB
         (
          …
        )
        GO
        EXEC xp_cmdshell 'dir D:ank' --查看文件

        

    •  定义存储过程的语法

         

    CREATE PROC[DEURE]  存储过程名
    @参数1 数据类型 = 默认值 [OUTPUT],
    @参数2 数据类型 = 默认值 [OUTPUT],
    ...
    @参数n 数据类型 = 默认值 [OUTPUT]
    
    AS
    
    SQL语句
    
    GO
    •  调用存储过程   

         

    EXEC  过程名 [参数]
    •  用户自定义存储过程

      

    1.  创建不带参数存储过程
      --创建存储过程
      if (exists (select * from sys.objects where name = 'proc_get_student'))
          drop proc proc_get_student
      go
      create proc proc_get_student
      as
          select * from student;
      
      --调用、执行存储过程
      exec proc_get_student;
    2.  修改存储过程
      --修改存储过程
      alter proc proc_get_student
      as
      select * from student;
    3. 带参存储过程
      --带参存储过程
      if (object_id('proc_find_stu', 'P') is not null)
          drop proc proc_find_stu
      go
      create proc proc_find_stu(@startId int, @endId int)
      as
          select * from student where id between @startId and @endId
      go
      
      exec proc_find_stu 2, 4;
    4. 带通配符参数存储过程
      --带通配符参数存储过程
      if (object_id('proc_findStudentByName', 'P') is not null)
          drop proc proc_findStudentByName
      go
      create proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%')
      as
          select * from student where name like @name and name like @nextName;
      go
      
      exec proc_findStudentByName;
      exec proc_findStudentByName '%o%', 't%';
    5. 带输出参数存储过程
      if (object_id('proc_getStudentRecord', 'P') is not null)
          drop proc proc_getStudentRecord
      go
      create proc proc_getStudentRecord(
          @id int, --默认输入参数
          @name varchar(20) out, --输出参数
          @age varchar(20) output--输入输出参数
      )
      as
          select @name = name, @age = age  from student where id = @id and sex = @age;
      go
      
      -- 
      declare @id int,
              @name varchar(20),
              @temp varchar(20);
      set @id = 7; 
      set @temp = 1;
      exec proc_getStudentRecord @id, @name out, @temp output;
      select @name, @temp;
      print @name + '#' + @temp;
    6. 不缓存存储过程
      --WITH RECOMPILE 不缓存
      if (object_id('proc_temp', 'P') is not null)
          drop proc proc_temp
      go
      create proc proc_temp
      with recompile
      as
          select * from student;
      go
      
      exec proc_temp;
    7.  加密存储过程
      --加密WITH ENCRYPTION 
      if (object_id('proc_temp_encryption', 'P') is not null)
          drop proc proc_temp_encryption
      go
      create proc proc_temp_encryption
      with encryption
      as
          select * from student;
      go
      
      exec proc_temp_encryption;
      exec sp_helptext 'proc_temp';
      exec sp_helptext 'proc_temp_encryption';
    8.  带游标参数存储过程

      if (object_id('proc_cursor', 'P') is not null)
      
          drop proc proc_cursor
      go
      create proc proc_cursor
          @cur cursor varying output
      as
          set @cur = cursor forward_only static for
          select id, name, age from student;
          open @cur;
      go
      --调用
      declare @exec_cur cursor;
      declare @id int,
              @name varchar(20),
              @age int;
      exec proc_cursor @cur = @exec_cur output;--调用存储过程
      fetch next from @exec_cur into @id, @name, @age;
      while (@@fetch_status = 0)
      begin
          fetch next from @exec_cur into @id, @name, @age;
          print 'id: ' + convert(varchar, @id) + ', name: ' + @name + ', age: ' + convert(char, @age);
      end
      close @exec_cur;
      deallocate @exec_cur;--删除游标
    9. 分页存储过程

      ---存储过程、row_number完成分页
      if (object_id('pro_page', 'P') is not null)
          drop proc proc_cursor
      go
      create proc pro_page
          @startIndex int,
          @endIndex int
      as
          select count(*) from product
      ;    
          select * from (
              select row_number() over(order by pid) as rowId, * from product 
          ) temp
          where temp.rowId between @startIndex and @endIndex
      go
      --drop proc pro_page
      exec pro_page 1, 4
      --
      --分页存储过程
      if (object_id('pro_page', 'P') is not null)
          drop proc pro_stu
      go
      create procedure pro_stu(
          @pageIndex int,
          @pageSize int
      )
      as
          declare @startRow int, @endRow int
          set @startRow = (@pageIndex - 1) * @pageSize +1
          set @endRow = @startRow + @pageSize -1
          select * from (
              select *, row_number() over (order by id asc) as number from student 
          ) t
          where t.number between @startRow and @endRow;
      
      exec pro_stu 2, 2;
    •  删除存储过程
      DROP PROC[EDURE] 过程名
  • 相关阅读:
    C# ToString() 转字符串设置保留小数位数
    PHP生成随机字符方法
    PHP面向对象程序设计的61条黄金法则
    CakePHP manual 中文翻译3
    CakePHP manual 中文翻译6
    在ASP中常见的错误80004005信息和解决办法
    CakePHP manual 中文翻译1
    CakePHP manual 中文翻译4
    CakePHP manual 中文翻译8
    如何在html文件中包含其他html文件
  • 原文地址:https://www.cnblogs.com/ang-664455/p/7107118.html
Copyright © 2020-2023  润新知