--维护数据库--



--存储过程(procedure)--

--概述:
  SQl Serve的存储过程是由一个或多个T-SQL语句组成的一个集合。常用的程序代码段通常被创建成存储过程,一次创建多次调用,这样既简化程序员的工作也减少与服务器交互的网络通信流量。存储过程中可以包含数据库中执行操作的程序语句,也包括调用其他过程。存储过程可以接收和输出参数,向调用它的程序返回值。存储过程被调用后,会返回给调用它的程序状态值,以表明调用成功或者调用失败以及调用失败的原因。
--使用存储过程的优点:
1)减少网络流量。在客户端和服务器的交互中,T-SQL语言中的每个代码行在执行时都是要利用网络发送的,代码被封装成存储过程,只有对执行存储过程语句的调用时才会利用网络发送。
2)增强安全性。在客户端和服务器之间调用存储过程时,只有执行存储过程的语句是可见的,用户无法看到或访问到存储过程所涉及的数据库对象,便无法破坏这些对象,使用为存储过程加密也能保障存储过程的安全。
3)提升编程效率。存储过程对常用代码的封装采用了消除重复代码的编写操作,降低代码的不一致性,并允许拥有权限的用户访问和执行代码,提升代码编程效率。
4)提高执行效率。系统默认下,只有首次执行存储过程时需要编译存储过程,创建一个执行计划,今后在执行该存储过程时则无需在编译,节省程序处理时间,提高执行效率。如果存储过程引用的数据发生变化明,也无需重新编写存储过程,系统提供了重新编译存储过程来帮助存储过程正确执行。
--分类:(在SQL Server 中存储过程分为用户自定义存储过程、系统存储过程和拓展存储过程三种类型)
1)用户自定义存储过程。该存储过程封装了用户所需的功能代码,可以单纯实现一段程序代码,可以通过输入参数接收用户输入的值(带输入参数的存储过程),可以使用输出参数将存储过程执行后的结果返回给调用它的语句(带输出参数的存储过程)。
2)系统存储过程。以sp_开头的存储过程是系统存储过程。是系统封装好的程序代码。例如:sp_helptext表示查看数据库对象信息;sp_helpindex表示查看表中索引信息。
3)拓展存储过程。以xp_开头的存储过程是拓展存储过程。由系统提供,用来在SQL Server和外部程序之间提供一个接口,以实现各种系统的维护活动。例如:xp_loogininfo表示返回Windows用户和Windows组的相关信息。
--存储过程管理:
--存储过程的创建和执行(注:创建存储过程的语句要存在于同一个批处理中。)
  --不带参数的存储过程
  ♦创建:
create procedure 存储过程名 --create procedure命令表示创建存储过程,procedure允许只写前四个字母proc。
[with encryption] --with encryption是可选项,可以为存储过程的创建文本加密。
[with recompile] --with recompile是可选项,使存储过程在执行时不保存执行计划,在每次执行时重新编译,以防止覆盖已存在于内存中的执行计划。
as
T-SQL语句

例:(创建名为“p_客户信息表_地址”的存储过程,用来实现在“商品管理数据库”的“客户信息表”中查询“辽宁沈阳”的客户信息)
use 商品管理数据库
go
select*from 客户信息表 where 地址='辽宁沈阳' --创建前可以先查询一下要封装的记录

use 商品管理数据库
go
create proc p_客户信息表_地址 --创建存储过程
as
select*from 客户信息表 where 地址='辽宁沈阳'

  ♦执行:
execute 存储过程名 --execute表示执行存储过程,可以简写exec。

例:
use 商品管理数据库
go
exec p_客户信息表_地址

  --带参数的存储过程(带输入参数的存储过程 和 带输出参数的存储过程)
    --1)带输入参数的存储过程
    ♦创建:
create procedure 存储过程名 --create procedure命令表示创建存储过程,procedure允许只写前四个字母proc。
@参数名 数据类型[(长度)] [, ......] --参数名,应声明在as之前
[with encryption] --with encryption是可选项,可以为存储过程的创建文本加密。
[with recompile] --with recompile是可选项,是存储过程在执行时不保存执行计划,在每次执行时重新编译,以防止覆盖已存在于内存中的执行计划。
as
T-SQL语句

例:(创建名为“p_客户信息表_地址x”的存储过程,用来实现在“商品管理数据库”的“客户信息表”中查找指定地址的客户信息)
use 商品管理数据库
go
create proc p_客户信息表_地址x
@address nvarchar(30)
as
select*from 客户信息表 where 地址=@address  

    ♦执行:
execute 存储过程名 [@参数名=] 参数值 [, ...] --“参数值”的数据类型必须与被赋值参数的数据类型兼容

例:(执行存储过程“P_客户信息表_地址x”,查找出地址“辽宁沈阳”的客户信息)
use 商品管理数据库
go
exec p_客户信息表_地址x @address='辽宁沈阳'
exec p_客户信息表_地址x '辽宁大连' --省略参数名

    --2)带输出参数的存储过程
    ♦创建:
create procedure 存储过程名 --create procedure命令表示创建存储过程,procedure允许只写前四个字母proc。
[@参数名 数据类型[(长度)][ , ...... , ] ]
@参数名 数据类型[(长度)] output [ , ...... ]
[with encryption]
[with recompile]
as
T-SQl语句
--允许创建只带输入参数的存储过程,也允许创建既带输出参数又带输入参数的存储过程。输出参数要在声明参数后加上output关键字来指明。通常再被封装在存储过程中的T-SQL语句中为输出参数赋值。

例:(创建名为“p_客户信息表_姓名”的存储过程,将查询“客户信息表”中客户编号为20130001的客户信息姓名,并将客户姓名赋值给一个输出参数的查询代码封装到该存储过程中)
create proc p_客户信息表_姓名
@name nvarchar(5) output
as
set @name=(select 客户姓名 from 客户信息表 where 客户编号='20130001')
--select @name=客户姓名 from 客户信息表 where 客户编号='20130001'

    ♦执行:
declare @参数名 数据类型[(长度)][, ...] --首先使用declare命令声明执行过程中所涉及的参数,包括输入参数和输出参数
[set @参数=值1] ... --如果使用了输入参数,用set语句为输入参数赋值
execute 存储过程名 [@参数[, ... ,]] @参数 output [, ...]

例:(执行名为“p_客户信息表_姓名”的存储过程,要求将查询“客户信息表”中的客户编号为20130001的客户姓名显示出来)
use 商品管理数据库
go
declare @name nvarchar(5)
exec p_客户信息表_姓名 @name output
print '客户编号为20130001的客户姓名为:'+@name

  1. 例:带输入参数的存储过程、带输出参数的存储过程 的创建和执行的总例:(创建名为“p_客户信息表_编号_姓名”的存储过程,要求将查询“客户信息表”中指定客户编号的客户姓名显示出来。并执行存储过程查看结果)
  2. create proc p_客户信息表_编号_姓名
  3. @num nchar(8),@name nvarchar(5) output --定义了一个输入参数@num和一个输出参数@name,数据类型和取值范围与“客户信息表”中的“客户编号”字段和“客户姓名”字段一致
  4. as
  5. select @name=客户姓名 from 客户信息表 where 客户编号=@num
  6.  
  7. use 商品管理数据库
  8. go
  9. declare @num nchar(8),@name nvarchar(5) --定义了@num@name两个用来与存储过程中的参数传递和接收值。
  10. set @num='' --使用set命令为变量@num赋值,以便将值传给输入参数@num
  11. exec p_客户信息表_编号_姓名 @num,@name output --exec执行存储过程时按顺序将两个变量带入到存储过程中。
  12. print '客户编号为'+@num+'的客户的姓名为:'+@name --print语句使用了字符串连接运算,输出详细结果。

理解例子

--查看存储过程

注:可以使用系统存储过程sp_helptext、sp_help和sp_depends查看存储过程的创建信息和创建文本。
exec 系统存储过程 用户自定义存储过程名
说明:sp_helptext显示被查看的存储过程的创建文本信息,创建时被加密的存储过程的创建文本信息不能被查看。
sp_help显示被查看的而存储过程的所有者类型创建时间包含哪些参数等信息。
sp_depends显示被查看的存储过程所关联的数据表和字段信息

例:
use 商品管理数据库
go
exec sp_depends p_客户信息表_姓名
exec sp_help p_客户信息表_姓名
exec sp_helptext p_客户信息表_姓名

--修改存储过程
注:在管理数据库过程中,可以根据需要修改已创建的用户自定义存储过程。对于已经加密的存储过程,不能使用管理器方式修改其内容,拥有权限的用户可以使用T-SQl语言修改其创建内容,同时将加密属性去掉,当实质上是删除原来的加密的存储过程,重新创建一个新的存储过程,使用时须谨慎使用。
alter procedure 存储过程名 ---alter命令表示修改,“存储过程名”必须是已存在的用户自定义的存储过程。procedure允许只写前四个字母proc。
[@参数名 数据类型[(长度)][, ... ,]] @参数名 数据类型[(长度)] output [, ......]
[with encryption]
[with recompile]
as
T-SQL语句

例:(将名为“p_客户信息表_姓名”的存储过程 的功能修改为查找客户编号为20130003的客户信息,并将结果传递给一个参数)
use 商品管理数据库
alter proc p_客户信息表_姓名
@name nvarchar(5) output
as
set @name=(select 客户姓名 from 客户信息表 where 客户编号='20130003')

--删除存储过程
注:对于不再使用的存储过程可以将其删除,以节省磁盘空间。删除存储过程不会对它所涉及的数据表等数据库对象产生影响,但调用它的语句再次使用时会产生错误。
drop procedure 存储过程名 --drop 命令表示删除命令,可以删除加码和不加密的存储过程,删除时并没有确认是否删除的提示,需谨慎使用。procedure允许只写前四个字母proc。

例:(删除名为“p_进货信息表_商品编号”的已加密的存储过程)
use 商品管理数据库
go
drop proc p_进货信息表_商品编号

--重编译存储过程
注:由于存储过程执行一次后会把编译过程记录到内存中,当再次执行同一个存储过程时则无需编译而直接执行。随着用户对系统的操作,数据库中的数据随时可能发生变化,如果变化涉及了存储过程所关联的数据表,那么存储过程需要重新编译,以得到正确的执行结果。重新编译存储过程有三种方法。
1)创建存储过程的同时重新编译
create procedure 存储过程名
with recompile --with recompile命令使存储过程在执行时不保存执行计划,在每次执行时重新编译,以防止覆盖已存在于内存中的执行计划。
as
T-SQL语句

2)执行存储过程的同时重新编译
exec 存储过程名 with recompile --在执行存储过程的同时使用with recompile语句,可以使存储过程在执行时重新编译。

3)使用命令方式预设存储过程重新编译
exec sp_recompile 存储过程名 --可以为已创建的存储过程预设重新编译,即从预设语句执行结束后,下一次执行存储过程时为存储过程重新编译。

例:(使用系统存储过程sp_recompile为存储过程“p_客户信息表_姓名”预设重新编译)
use 商品管理数据库
go
exec sp_recompile 'P_客户信息表_姓名'


注:"--"可看成说明或者注释文本

SQL Server 数据库的维护(一)__存储过程(procedure)的更多相关文章

  1. SQL Server 数据库的维护(二)__触发器

    --维护数据库-- --触发器-- --概述: 触发器是一种特殊类型的存储过程,用来强制执行业务规则.在调用执上,触发器不能像存储过程那样可以由用户通过T-SQL语句直接调用,而是需要有数据库所发生的 ...

  2. SQL Server 数据库的维护(三)__事务(transaction)和锁

    --维护数据库-- --事务(transaction)和锁-- --事务(transaction)-- --概述: 事务是指封装了一组T-SQL语句的单个逻辑单元.单元中的所有语句作为一个整体,在满足 ...

  3. SQL Server 数据库的维护(四)__游标(cursor)

    --维护数据库-- --游标(cursor)-- --概述: 注:使用select语句查询结果的结果集是一个整体,如果想每次处理一行或一部分行数据,游标可以提供这种处理机制.可以将游标理解为指针.指针 ...

  4. SQL Server数据库存储过程中拼接字符串注意的问题

    在SQL Server数据库中书写复杂的存储过程时,一般的做法是拼接字符串,最后使用EXEC sp_executesql '拼接的字符串' 查询出结果. 先看一段代码: -- ============ ...

  5. Sql Server数据库之存储过程

    阅读目录 一:存储过程概述 二:存储过程分类 三:创建存储过程 1.创建无参存储过程 2.修改存储过程 3.删除存储过程 4.重命名存储过程 5.创建带参数的存储过程   简单来说,存储过程就是一条或 ...

  6. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  7. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  8. 基于Spring Boot,使用JPA调用Sql Server数据库的存储过程并返回记录集合

    在上一篇<基于Spring Boot,使用JPA操作Sql Server数据库完成CRUD>中完成了使用JPA对实体数据的CRUD操作. 那么,有些情况,会把一些查询语句写在存储过程中,由 ...

  9. SQL Server数据库存储过程的异常处理

    SQL Server数据库存储过程的异常处理是非常重要的,明确的异常提示能够帮助我们快速地找到问题的根源,节省很多时间.本文我们就以一个插入数据为例来说明SQL Server中的存储过程怎么捕获异常的 ...

随机推荐

  1. html: title换行方法 如a链接标签内title属性鼠标悬停提示内容换行

    换行代码符合分别为: “&#;”和“&#;” <a href="0.shtml" title="第一排 第二排 第三排">title ...

  2. Linux命令(22)find的使用

    在linux下面工作,有些命令能够大大提高效率. 比如说find命令,他哥俩可以算是必会的linux命令,几乎每天都要用到他们. find命令 find命令的一般形式 find命令的常用选项及实例 f ...

  3. left join 取一条数据

    产品生产过程中要记录产品在制作过程中的不良历史,即使在一个工序,也可以产生多条不良历史记录,所有的不良信息保存在B表中.假设产品在打包工序,存放打包工序成品参数记录的表A,数据是唯一的.但在打包过程中 ...

  4. JVM实用参数(八)GC日志

    本系列的最后一部分是有关垃圾收集(GC)日志的JVM参数.GC日志是一个很重要的工具,它准确记录了每一次的GC的执行时间和执行结果,通过分析GC日志可以优化堆设置和GC设置,或者改进应用程序的对象分配 ...

  5. PSP(11.16~11.23)

    18号 类别c 内容c 开始时间s 结束e 中断I 净时间T 看书 构建之法 9:00 10:00 0 60m 看书 查资料 10:00 11:15 5 70m 个人 写博客 13:30 14:55 ...

  6. Python基础篇【第5篇】: Python模块基础(一)

    模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...

  7. php和js如何通过json互相传递数据

    当我们在结合php和javascript实现某些功能时,经常会用到json.json是js的一种数据格式,可以直接被js解析.而php无法直接读取json数据,但是php提供了json_decode函 ...

  8. 修饰符const,static与readonly

    在c语言中,存储区可以分成代码区,全局区(用于存放全局变量和静态变量),常量区(用户存放常量),栈,堆. 首先介绍const,const是常量的标志,表示变量不可被修改.const变量,申明的时候就必 ...

  9. 《疯狂Java讲义》(一) ---- 关于学习Java的反思

    "听到Spring很火,就立马买来一本Spring的书来读,最后结果往往是失败,因为这种学习没有积累,没有根基,学习过程中困难重重,每天都被一些相同.类似的问题所困扰,起初热情十足,经常上论 ...

  10. TP-LINK WR841N V8刷OpenWRT

    在某宝上淘了一个TP-LINK WR841N V8,已经硬改为8M闪存和64M内存,还刷好了Uboot.但是卖家刷好的系统是第三方定制过的OpenWRT,集成了很多不需要用到的软件,所以我要刷回官方原 ...