SQL Server存储过程

SQL Server存储过程

定义:

  • 用户通过制定存储过程的名称并给出参数来执行它;
  • SQL Server为了实现特定任务,而将一些多次调用的固定操作语句编写成程序段,这些程序段存储在服务器上,由数据库服务器来调用;
  • 命名前缀:proc_名称,proc是procedure(过程)的简写;

优缺点

优点

  • 重复使用,减少数据库开发人员的工作量;
  • 封装复杂的数据库操作,简化操作流程;
  • 减少网络流量,调用过程只需传递名称与参数;
  • 安全性,防止SQL注入式攻击,同时可设定用户对指定存储过程的执行权限;
  • 误解:比SQL语句执行快(未被认证)

缺点

  • 调试麻烦;
  • 移植问题;
  • 重新编译问题,当引用关系的对象发生改变时,受影响的存储过程、包将需要被重新编译;
  • 不支持面向对象设计,无法采用面向对象的方式将逻辑业务进行封装,甚至形成通用的可支持服务的业务逻辑框架;

分类

系统存储过程

  • 存储在系统数据库master中;
  • 用来从系统表中获取信息,为系统管理员提供帮助,为用户查看数据库提供方便;
  • 存储过程位于数据库服务器中,以sp_开头,系统存储郭恒定义在系统定义和用户定义的数据库中,调用时,不必在存储过程中加数据库限定名;
  • 一些系统存储过程只能由系统管理员使用,而有些系统存储过程通过授权可以被其它用户使用;

用户存储过程(自定义存储过程)

  • 存储在tempdb数据库中;
  • 用户使用T_SQL语句编写的,为了实现某一特定业务需求,在数据库中编写的T_SQL语句集合,自定义存储过程可以接受输入参数、向客户端返回结果和信息,返回输出参数等;
  • 临时存储过程:
    • 全局的临时存储过程,存储过程名前加上“##”;
    • 局部临时存储过程,存储过程名前加上“#”;

扩展存储过程

  • 以在SQL Server环境外执行的动态链接(DLL文件)来实现,可以加载到SQL Server实例运行的地址空间来执行;
  • 扩展存储过程以前缀“xp_”来标识;

创建存储过程

无参存储过程

  • Proc与Procedure相同;
  • 调用存储过程:exec
  • 创建存储过程
-- 判断存储过程是否存在
if (exists (select * from sys.objects where name = 'getAllBooks'))
    Drop Procedure getAllBooks
go
    -- 创建存储过程
    Create Procedure getAllBooks 
as
    -- SQL语句
    Select * From books
  • 修改存储过程
Alter Procedure getAllBooks
as
    -- 修改后SQL语句
    Select book_name From books
  • 删除存储过程
-- 删除存储过程
drop Procedure getAllBooks
  • 重命名存储过程
sp_rename getAllBooks,proc_get_allBooks

有参存储过程

  • 参数分类
    • 输入参数,用于向存储过程传入值;
    • 输出参数,用于调用存储过程后,返回结果;
  • 值传递和引用传递
    • 基本数据类型赋值属于值传递;引用类型之间赋值属于引用传递;
    • 值传递传递的是变量值;引用传递传递的事对象的引用地址;
    • 值传递后,两个变量改变的是各自的值;引用传递后,两个引用改变的是同一个对象的状态;
  • 单个参数存储过程
if(exists (Select * From sys.objects Where name = 'searchBooks'))
    Drop Procedure searchBooks
go 
Create Proc searchBooks(
    -- 参数声明(@参数名 类型 [=默认值] )
    @bookID int
    )
as 
    Select * From books 
    Where book_id = @bookID

-- 调用存储过程
exec searchBooks 1;
  • 多个参数存储过程(两个参数)
if(exists (Select * From sys.objects Where name = 'searchBooks'))
    Drop Procedure searchBooks
go 
Create Proc searchBooks(
    @bookID int ,
    @auth nvarchar(50)
    )
as 
    Select * From books 
    Where book_id = @bookID
    And book_auth = @auth
-- 调用存储过程
exec searchBooks 1 , '孔子'
  • 带返回值的存储过程
if (exists (Select * From sys.objects Where name = 'getBookId'))
    Drop Procedure getBookId
go 
Create Procedure getBookId(
    @bookauth nvarchar(20), --无默认值
    @bookId int output --无默认值
)
as 
    Select @bookId = book_Id From books
    Where book_auth = @bookauth

--调用存储过程
declare @Id int 
exec getBookId '金庸',@Id output
select @id as booksId
  • 参数带通配符的存储过程(参数有默认值)
if (exists (select * from sys.objects where name = 'charBooks'))
    drop proc charBooks
go
create proc charBooks(
    @bookAuth varchar(20)='金%',--默认值
    @bookName varchar(20)='%'--默认值
)
as 
    select * from books where book_auth like @bookAuth and book_name like @bookName;

--执行存储过程
exec  charBooks  '孔%','论%'; 

你可能感兴趣的:(SQL,Server)