博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL入门经典(八)之存储过程
阅读量:5314 次
发布时间:2019-06-14

本文共 3336 字,大约阅读时间需要 11 分钟。

     存储过程(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 AdventureWorksGO --切换到AdventureWorks数据库CREATE PROCEDURE sp_EmployeeAS SELECT * FROM HumanResources.EmployeeGO--提前处理语句。防止下面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 AdventureWorksGO --切换到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条信息

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

CREATE PROCEDURE sp_ContactPage@pageStart int,@pageEnd   int,@pageCount int OUTPUTAS begin     SELECT @pageCount=count(1) FROM Person.Contact;--获取总条数。并且设置@pageCount的值     WITH Contact as( select row_number() over(order by ContactID desc) as RowNumber,*  from Person.Contact)     SELECT * from Contact where  RowNumber between @pageStart and @pageEnd; --分页查询,在sql server 2012有更简单分页查询。这是SQL SERVER 2005以后支持。2000需要子查询。博客后面会介绍漏掉的子查询和索引,SQL脚本这些。end declare @rowcount int exec sp_ContactPage 0,20,@rowcount outputselect @rowcount
View Code

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

CREATE PROCEDURE sp_errorLogin@username nvarchar(20), @userpass nvarchar(30)ASbegin     if(@username!='admin')       return -1;--表示用户名不存在(为了方便不使用数据库了)    if(@userpass!='admin')       return 1;--密码错误    return 0;--登录成功enddeclare @status int ;exec @status= sp_errorLogin 'admin','222'select @status as '密码错误'exec @status= sp_errorLogin '222','222'select @status as '帐号错误'exec @status= sp_errorLogin 'admin','admin'select @status as '登录成功'
View Code

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

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

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

CREATE proc sp_jx@size int ,@count int outputAS   declare @temp_s int ;   declare @temp_c int ;   if @size >=1     begin       select @temp_s=@size-1;       exec sp_jx @temp_s,@temp_c output       select @count= @size*@temp_c;     end   else     select @count=1 return GOdeclare @count int exec sp_jx 5,@count output select @countexec sp_jx 32,@count output select @count
View Code

 

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

1.通常更佳的性能。

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

3.可以重用代码

4.划分代码

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

缺点

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

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

未完待续。

转载于:https://www.cnblogs.com/panda951010/p/5616077.html

你可能感兴趣的文章
变量提升
查看>>
jquery-jqzoom 插件 用例
查看>>
查看oracle数据库的连接数以及用户
查看>>
三.野指针和free
查看>>
简单【用户输入验证】
查看>>
python tkinter GUI绘制,以及点击更新显示图片
查看>>
20130330java基础学习笔记-语句_for循环嵌套练习2
查看>>
Spring面试题
查看>>
C语言栈的实现
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
使用命令创建数据库和表
查看>>
在16aspx.com上下了一个简单商品房销售系统源码,怎么修改它的默认登录名和密码...
查看>>
linux下Rtree的安装
查看>>
多米诺骨牌
查看>>