存储过程(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>

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

USE AdventureWorks
GO --切换到AdventureWorks数据库 CREATE PROCEDURE sp_Employee
AS
SELECT * FROM HumanResources.Employee GO--提前处理语句。防止下面EXEC sp_Employee抛出错误 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]

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

USE AdventureWorks
GO --切换到AdventureWorks数据库 CREATE PROCEDURE sp_Contact
@LastName nvarchar(50)
AS
SELECT * FROM Person.Contact WHERE LastName LIKE '%'+@LastName+'%' exec sp_Contact --未提供值, 消息 201,级别 16,状态 4,过程 sp_Contact,第 0 行 过程或函数 'sp_Contact' 需要参数 '@LastName',但未提供该参数。
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. MD5编码的内存泄露

    MD5CryptoServiceProvider 如果多次使用会产生内存溢出,如下这样调用几百万次就会出现内存 溢出. public static string MD5Encode(string so ...

  2. PHP使用命名空间:别名/导入(Aliasing/Importing)

    1.导入,就是使用use操作符 2.在一个类中导入了另一个类之后,当前的命名空间仍然是当前类的命名空间 3.注意对命名空间中的名称(包含命名空间分隔符的完全限定名称如 Foo\Bar以及相对的不包含命 ...

  3. cesium+ geoserverTerrainProvide+png展示3D高程图展示

    一.发布png到geoserver的imagepyramid // translate png to tif epsg:4326 File png = new File(pngPathStr); Bu ...

  4. ssh学习小记

    ssh 为Secure SHell 的缩写.OpenSSH: ssh协议的开源实现.  SSH协议版本 v1: 基于CRC-32做MAC,不安全:man-in-middle v2:双方主机协议选择安全 ...

  5. android 获取系统联系人 完全解析

    一.代码 1.ContactsEngine.java import java.util.ArrayList; import java.util.HashMap; import java.util.Li ...

  6. eclipse中安装adt插件

    对于程序开发的学者来说,eclipse并不陌生,它为我们提供了一个非常广阔的平台来开发程序.同样我们也可以用它来开发android程序.但是在eclipse中并不能直接开发android程序,需要我们 ...

  7. ZOJ3795_Grouping

    告诉你某些人的年龄大小关系,问你把所有的人分成若干个组,最少需要多少组,使得组内任意两个人的年龄不可比. 首先考虑特殊情况,如果所有年龄关系构成了一个环,那么这个环中所有人的年龄都是相等,也就是可比的 ...

  8. selenium-pageobject设计模式

    from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom time import sleepfrom ...

  9. 页面超慢,zabbix却没报警

    故障背景:网站页面打开速度非常慢 排查过程: 1.一开始用vmstat 看到procs下的r值稳定在5.6,由于这台服务器是12核24线程,并且cpu的wa很大,说明系统很轻松, 肯定不会报警了,那为 ...

  10. 【菜鸟玩Linux开发】Redis安装和自启动配置

    Redis是一个C实现的基于内存.可持久化的键值对数据库,在分布式服务中常作为缓存服务.本篇将介绍在CentOS下如何从零开始安装到配置启动服务. 一. 安装Redis Redis的安装其实相当简单, ...