存储过程(stored procedure)有时候称为sproc,它是真正的脚本-或者更准确的说,他是批处理(batch)-它存储于数据库中,而不是淡出的文件中。无论如何,这个比较并不是很确定。存储过程有输出参数,输入参数已及返回值等。而脚本不会有这些内容。

存储过程基本语法:CREATE PROCEDURE|PROC <sproc name>

[<parameter name> <data type> [VARYING][<default value>] [OUTPUT]],

[<parameter name> <data type> [VARYING][<default value>] [OUTPUT]]

[........,n]

[WITH PECOMPILE|ENCRYPTION|EXECUTE AS{ CALLER |SELF|OWNER|<'user name '>}]

[ FOR REPLICATION]

AS

<code>|EXTERNAL NAME<assembly name>.<assembly class>.<method>

试一试最简单基本存储过程:

  1. USE AdventureWorks
  2. GO --切换到AdventureWorks数据库
  3.  
  4. CREATE PROCEDURE sp_Employee
  5. AS
  6. SELECT * FROM HumanResources.Employee
  7.  
  8. GO--提前处理语句。防止下面EXEC sp_Employee抛出错误
  9.  
  10. exec sp_Employee

看起来是不是很简单。返回一个data表。没有参数的存储过程。

使用ALTER 修改存储过程。

在使用T-SQL编辑存储过程需要注意,这是完全替换现有的存储过程。使用ALTER PROC还是CREATE PROC语句的唯一缺点包括以下几点:

1.ALTER PROC:期望找到一个已有的存储过程,而CREATE不是。

2.ALTER PROC:保留存储过程上已经建立的任何权限。它在系统对象中保留了相同的对象ID并允许保留依赖关系。如:过程A调用过程B,并删除和重新创建了过程B,那么不能在看到这二者的依赖关系了。如果使用ALTER ,依赖关系仍然存在。

3.ALTER PROC:在可能调用被修改的存储过程的其他对象上保留任何依赖信息(这一条也是最重要的)。

删除储存过程:这个最简单不过了。还是删除数据库、表和视图等对象通用语句,

DROP PROC|PROCEDURE  <sporcedure name> 就完成整个删除工作了。

使用参数化存储过程:

声明参数是需要下面2-4条信息:名称,数据类型,默认值,反向。其语法:@parameter_name [AS] datatype  [=defalut|NULL] [VARYING ] [OUTPUT|OUT]

创建一个和前面不同版本的存储过程

  1. USE AdventureWorks
  2. GO --切换到AdventureWorks数据库
  3.  
  4. CREATE PROCEDURE sp_Contact
  5. @LastName nvarchar(50)
  6. AS
  7. SELECT * FROM Person.Contact WHERE LastName LIKE '%'+@LastName+'%'
  8.  
  9. exec sp_Contact --未提供值, 消息 201,级别 16,状态 4,过程 sp_Contact,第 0 过程或函数 'sp_Contact' 需要参数 '@LastName',但未提供该参数。
  10. exec sp_Contact 'ad' --查询完成共233条信息

如何获取输出参数并有返回值:在做分页查询时候会用到这种。先看下存储过程

 

如何使用返回值来获取错误结果:

 

后面章节讲@@Error和try....cacth的异常处理,我把它们放在事务里讲了。因为事务发生错误就会rollback tran。

递归:编程很少会用到递归,有时候递归是最有效的解决方案,如菜单树。递归是指一条代码自身调用自身的情况,危险性也是很明显-就是进行死循环的调用。如何调用取决你或者代码。SQL递归调用最多只有32次,超过32次就会抛出异常。

最经典的就是阶乘如:5的阶乘120它是如何实现 5*4*3*2*1。

 

使用存储过程的时机:(优点)

1.通常更佳的性能。

2.可以作为安全隔离层(控制数据访问和跟新方式)

3.可以重用代码

4.划分代码

5.根据在运行时建立的动态而可以灵活执行

缺点

移植性差,不能跨平台移植

在一些情况下可能因为错误的执行计划而被锁定(实际影响性能).

SQL入门经典(八) 之存储过程的更多相关文章

  1. SQL入门经典(十) 之事务

    事务是什么?事务关键在与其原子性.原子性概念是指可以把一些事情当作一个执行单元来看待.从数据库角度看待.他是指应该全部执行或者全部不执行一条或多条语句的最小组合.当处理数据时候经常确保一件事发生另一件 ...

  2. 《SQL入门经典》总结

    <SQL入门经典>这本书从考试前就开了个头,一直到前两天才看完,拉的战线也够长的.放假来了,基本上什么内容都不记得了.好不容易看完了,就赶紧总结一下吧! 该书分为两大部分,第一部分是第1~ ...

  3. SQL入门经典(一)之简介

    今天是我第一天开通博客,也是我的第一篇博客.以后为大家带来第一篇关于学习技术性文章,这段时间会为大家带来是SQL入门学习.希望大家坚持读下去,因为学历有限.我也是初学者.语言表达能力不好和知识点不足, ...

  4. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)

    第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的  DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...

  5. sql 入门经典(第五版) Ryan Stephens 学习笔记 后续——存储引擎

    一.引擎基础 1 查看系统支持的存储引擎 show engines; 2 查看表使用的存储引擎两种方法: a.show table status from database_name where na ...

  6. SQL入门经典(七) 之脚本和批处理

    什么是脚本.我们前面学的CREATE TABLE <table name> ,USE <database name>这些都是脚本,为什么用脚本.脚本存储到文件中并且可以重复利用 ...

  7. SQL入门经典(九) 之自定义函数

    UDF和存储过程很类似,用户自定义函数是一组有序的T-SQL语句,这些语句被预先优化和编译,并且可以作为一个单元来测试调用.UDF和存储过程的主要区别在于结果返回方式,为了能支持更多返回值,UDF比存 ...

  8. SQL入门经典(六) 之视图

    视图实际上就是一个存储查询,重点是可以混合和匹配来自基本表(或其他视图)的数据,从而创建在很多方面象另一个普通表那样的起的作用.可以创建一个简单的查询,仅仅从一个表(另一个视图)选择几列或几行,而忽略 ...

  9. SQL入门经典(五) 之键和约束

    这一篇博客主要讲键的创建,约束的创建.修改对象和删除对象. 主键:主键是每行的唯一标识符,必须包含唯一值(因此不能为NULL).由于主键在关系中数据库的重要性,因此它是所有键和约束中最重要的.一个表最 ...

随机推荐

  1. TCP协议学习记录 (一) ICMP时间戳请求

    程序只实现了获取时间戳,至于将时间戳转换成具体日期和时间,暂时没有好的办法. #define TIME_STAMP_REQUEST 13 struct iphdr { unsigned ; //包头长 ...

  2. 转载:分布式系统的CAP理论

    原文转载Hollis原创文章:http://www.hollischuang.com/archives/666 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提 ...

  3. arch 安装图形界面

    图形界面的安装.--- 引导: .显卡驱动,这里我们是集成显卡,根据wiki提示安装xf86-video-intel .安装xorg-server,xorg-server-utils,xorg-xin ...

  4. cocoapods specs 镜像

    在使用cocoapods 进行update 或者 install的时候 每次回去更新获取的pod specs,每次速度都不是很理想,博主最近对github上的specs仓库进行了镜像,分别在gitca ...

  5. POST 500 Internal Server Error

    今天调试公司web后台时发现一个POST 500 Internal Server Error的错误. 本来VS本地调试没有发现这个问题,然后发布到服务器时才出现了.然后找了好久没找到什么原因,再仔细在 ...

  6. 堆排序Heap sort

    堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 什么是堆 这里的堆(二叉堆),指得不是堆栈的 ...

  7. 断言(ASSERT)的用法

    ASSERT ()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行.如果表达式不为0,则继续执行后面的语句.这个宏通常原来判 ...

  8. poj3728

    [描述] 有 N 城 市在一个国家,有一个且只有一个简单的路径每一对城市之间. 一个商人选择了一些路径和想赚尽可能多的钱在每个路径. 当他沿着一条路径,可以选择一个城市购买一些商品和出售他们在一个城市 ...

  9. Git常用

    创建本地库 mkdir [dirname] cd [dirname] git init 1.创建项目目录 2.进入目录 3.git初始化 [dirname]为自己取的文件夹名字,例如mkdir myd ...

  10. 【Thinking in Java】类和对象的初始化过程

    在Java中, 当一个类被调用的时候,它的初始化过程是怎么样的呢? 当一个类被实例化的时候,它的初始化过程又是怎样的呢? 为什么static方法不能未经对象就调用非static方法? 下面我们通过例子 ...