前言:对于存储过程一直有一种抵触的心理,因为毕业至今所在的公司开发组都不是很规范,对于开发的一些注意事项并没有很多的规定,只是在知乎上查找相关知识的时候,看到很多人对于在程序里使用存储过程的不好之处都有很多介绍,碧如逻辑不清晰,调试难等,在项目中也不需要些存储过程,所以我也没有认真学习过相关知识,但是最近准备面试,发现还是有很多公司对于存储过程是有要求的,今天写点东西记录一下自己的学习过程,其实也就是对别人的博客进行一个自己的汇总。

什么是存储过程?

  根据百度百科的解释,存储过程是在大型关系型数据库中,一组完成特定功能的Sql语句集,在数据库中,经过一次编译之后调用不需要再次编译,用户通过指定存储过程的名称并给出参数(如果有的话)来执行它。

存储过程的优点?

  1、响应时间上有优势,普通sql,程序需要验证语句是否正确,以及编译优化,如果有很多业务逻辑需要进行处理,可能会多次链接数据库,但是使用存储过程的话,就只需要一次(预编译之后会被存储到高速缓存里),而且运算过程中不需要把数据取出数据库,数据库的IO通道效率很差,大量数据取出来很浪费时间;

  2、对于系统的稳定性有帮助,程序可能会出BUG导致系统不稳定,而存储过程则只要数据库不出现问题,基本上不会出现问题;

  3、减少了网络流量,只需要传输存储过程的名称和参数即可,从而降低了传输量;

  4、增强系统安全性,参数化的存储过程可以防止SQL注入,只授权部分用户修改存储过程的权限;

  5、可可重复使用,使得服务器端开发和数据库开发同时进行,加快开发速度;

  6、发布程序方便快捷,如果使用常规的sql语句来处理业务逻辑,业务修改,需要重新编译,然后停止程序进行发布;但是如果业务逻辑写在存储过程中,只需要修改存储过程即可,提高了程序的可移植性。

不过现在有些框架支持把Sql写到配置文件里面,只需要修改配置文件就可以修改业务。

存储过程的缺点?

  1、移植困难,不同类型的数据库存储过程语言差距巨大,基本上无法直接移植;

  2、存储过程本身运算性能很差,而且无法进行封装,不符合OOP的思想;

  3、对于开发和维护的的成本较高。

存过过程的写法

无参无输出的存储过程:

Create procedure 存储过程名
as
SQL语句

带参无输出的存储过程:

Create procedure 存储过程名
@参数 参数类型
as
SQL语句

带参带输出的存储过程:

Create procedure 存储过程名
@参数 参数类型
@返回值 返回类型 output
as
SQL语句
CREATE  procedure  proc_Test
@orderNum int,
@flag bit OUTPUT
as
if exists(
select * from SaleOrder where OrderNumber = @orderNum)
select @flag=
else
select @flag= //执行
DECLARE @re int EXEC proc_Test ,@re output SELECT @re as '返回值'

SqlServer学习之存储过程的更多相关文章

  1. SQLServer 学习笔记之超详细基础SQL语句 Part 10

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 9------------------- 删除约束的语法 ALTER T ...

  2. SQLServer 学习笔记之超详细基础SQL语句 Part 7

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 6------------------- 29 存储过程和触发器 存储过 ...

  3. SQLServer 学习笔记之超详细基础SQL语句 Part 5

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 4------------------- 21使用默认 默认(也称默认值 ...

  4. SQLServer 学习笔记之超详细基础SQL语句 Part 4

    Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 3------------------- 17 带比较运算符的嵌套查询 ...

  5. SQLServer学习之表的操作

    SQLServer学习之表的操作 关系数据库通常包含多个表.数据库实际上是表的集合,数据库的数据或者信息都是存储在表中的.表是对数据进行存储和操作的一种逻辑结构,每一个表都代表一个对用户意义的对象. ...

  6. JAVA使用JDBC技术操作SqlServer数据库执行存储过程

    Java使用JDBC技术操作SqlServer数据库执行存储过程: 1.新建SQLSERVER数据库:java_conn_test 2.新建表:tb_User 3.分别新建三个存储过程: 1>带 ...

  7. SQLServer学习笔记系列6

    一.写在前面的话 时间是我们每个人都特别熟悉的,但是到底它是什么,用什么来衡量,可能很多人会愣在那里.时间可以见证一切,也可以消磨一切,那些过往的点点滴滴可思可忆.回想往年清明节过后,在家乡的晚上总能 ...

  8. SQLServer学习笔记系列5

    一.写在前面的话 转眼又是一年清明节,话说“清明时节雨纷纷”,武汉的天气伴随着这个清明节下了一场暴雨,整个城市如海一样,朋友圈渗透着清明节武汉看海的节奏.今年又没有回老家祭祖,但是心里依然是怀念着那些 ...

  9. SQLServer学习笔记系列3

    一.写在前面的话 今天又是双休啦!生活依然再继续,当你停下来的时候,或许会突然显得不自在.有时候,看到一种东西,你会发现原来在这个社会上,优秀的人很多,默默 吃苦努力奋斗的人也多!星期五早上按时上班, ...

随机推荐

  1. 学PHP应注意的问题与知识点

    编出一手好代码,这个是需要你在平时开发中日积月累的,平时如果你有注意到以下的那些代码的编码,那么祝贺你,你在技能提升这方面已经垫下了一些基础,编写出一手好代码,说白了就是你特么注意到性能这块的问题,代 ...

  2. python 中对象is和==是怎么比较的

    Python中的对象包含三要素:id.type.value.其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值.is判断的是a对象是否就是b对象,是通过id来判断的.==判断的 ...

  3. C#winform和百度API互动-----之读取中js的参数

    上百度的API <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" c ...

  4. CentOS7重启后resolv.conf被重置的解决方案

    近期在修改一台CentOS7服务器的dns时发现只要重启服务器DNS就会被强制还原,解决方案如下: 1.首先在网卡设置中修改NM_CONTROLLED的值: 修改文件/etc/sysconfig/ne ...

  5. Swift 自动引用计数(ARC)

    Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存 通常情况下我们不需要去手动释放内存,因为 ARC 会在类的实例不再被使用时,自动释放其占用的内存. 但在有些时候我们还是需要在 ...

  6. Hbase shell操作表

    启动hbase shell ./bin/hbase shell 1.创建表,查看表 create 'tableName', 'familykey1','familykey2',.... eg. cre ...

  7. Java 实现 telnet命令 验证主机端口的连通性

    Java 实现 telnet命令 验证主机端口的连通性 1.Telnet 命令 Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式.它为用户提供了在本地计 ...

  8. iOS自定义下拉列表

    实现效果如下: 点击导航栏的“点击”,弹出下拉列表. 注意:绿色的是控制器的view背景,又一个遮罩层,点击可以隐藏列表. Github地址: https://github.com/PengSiSi/ ...

  9. HAProxy+Keepalived 高可用负载均衡

    转自 https://www.jianshu.com/p/95cc6e875456 Keepalived+haproxy实现高可用负载均衡 Master backup vip(虚拟IP) 192.16 ...

  10. Python操作qml对象

    1. 如何在python里获得qml里的对象? 1.1 获取根对象 QML: import QtQuick 2.12 import QtQuick.Controls 2.12 ApplicationW ...