存储过程其实就是已预编译为可执行过程的一个或多个SQL语句。 通过调用和传递参数即可完成该存储过程的功能。

前面有介绍过存储过程的一些语法,但是没有详细示例,今天我们来一起研究一下存储过程。

提高性能

SQL语句在创建过程时进行分析和编译。 存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划,这样,在执行过程时便可节省此开销。

2降低网络开销

存储过程调用时只需用提供存储过程名和必要的参数信息,从而可降低网络的流量。

3便于进行代码移植

数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。

4更强的安全性

1)系统管理员可以对执行的某一个存储过程进行权限限制,避免非授权用户对数据的访问
2)在通过网络调用过程时,只有对执行过程的调用是可见的。 因此,恶意用户无法看到表和数据库对象名称、嵌入自己的 Transact-SQL 语句或搜索关键数据。
3)使用过程参数有助于避免 SQL 注入攻击。 因为参数输入被视作文字值而非可执行代码,所以,攻击者将命令插入过程内的 Transact-SQL 语句并损害安全性将更为困难。
4)可以对过程进行加密,这有助于对源代码进行模糊处理。

劣势:

1逻辑处理吃力

SQL本身是一种结构化查询语言,但不是面向对象的的,本质上还是过程化的语言,面对复杂的业务逻辑,过程化的处理会很吃力。同时SQL擅长的是数据查询而非业务逻辑的处理,如果如果把业务逻辑全放在存储过程里面,违背了这一原则。

2修改参数复杂

如果需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新调用,等等,这时候估计会比较繁琐了。

3开发调试复杂

由于IDE的问题,存储过程的开发调试要比一般程序困难。

4无法应用缓存

虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。

5不支持群集

数据库服务器无法水平扩展,或者数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。

创建不带参数的存储过程

示例:查询订单表中订单总数

--查询存储过程

IF OBJECT_ID (N'PROC_ORDER_COUNT', N'P') IS NOT NULL

DROP procedure PROC_ORDER_COUNT;

GO

CREATE procedure PROC_ORDER_COUNT

AS

SELECT COUNT(OrderID) FROM Orders;

GO

执行上述存储过程:

EXEC PROC_ORDER_COUNT;

2创建带参数的存储过程

示例:根据城市查询订单数量

--查询存储过程,根据城市查询总数

IF OBJECT_ID (N'PROC_ORDER_COUNT', N'P') IS NOT NULL

DROP procedure PROC_ORDER_COUNT;

GO

CREATE procedure PROC_ORDER_COUNT(@city nvarchar(50))

AS

SELECT COUNT(OrderID) FROM Orders WHERE City=@city

GO

执行上述存储过程:

EXEC PROC_ORDER_COUNT  N'GuangZhou';

参数带通配符

--查询订单编号头两位是LJ的订单信息,含通配符

IF OBJECT_ID (N'PROC_ORDER_INFO', N'P') IS NOT NULL

DROP procedure PROC_ORDER_INFO;

GO

CREATE procedure PROC_ORDER_INFO

@OrderID nvarchar(50)='LJ%' --默认值

AS

SELECT OrderID,City,OrderDate,Price FROM Orders

WHERE OrderID like @OrderID;

GO

执行上述存储过程:

EXEC PROC_ORDER_INFO;

EXEC PROC_ORDER_INFO N'LJ%';

EXEC PROC_ORDER_INFO N'%LJ%';

4带输出参数

--根据订单查询的信息,返回订单的城市及单价

IF OBJECT_ID (N'PROC_ORDER_INFO ', N'P') IS NOT NULL

DROP procedure PROC_ORDER_INFO ;

GO

CREATE procedure PROC_ORDER_INFO

@orderid nvarchar(50),     --输入参数

@city nvarchar(20) out, --输出参数

@price  float output        --输入输出参数

AS

SELECT @city=City,@price=Price FROM Orders

WHERE OrderID=@orderid AND Price=@price;

GO

执行上述存储过程:

declare @orderid nvarchar(50),

@city nvarchar(20),

@price  int;

set @orderid= N'LJ0001';

set @price = 35.21;

exec PROC_ORDER_INFO @orderid,@city out, @price output;

select @city, @price;

上面两个在平时工作中遇到的较少,需要的时候知道怎么用即可,1,2个是必须掌握的操作。

新增

--新增订单信息

IF OBJECT_ID (N'PROC_INSERT_ORDER', N'P') IS NOT NULL

DROP procedure PROC_INSERT_ORDER;

GO

CREATE procedure PROC_INSERT_ORDER

@orderid  nvarchar(50),

@city nvarchar(20),

@price float

AS

INSERT INTO Orders(OrderID,City,Price)

VALUES(@orderid,@city,@price)

GO

执行

EXEC PROC_INSERT_ORDER N'LJ0001',N'GuangZhou',35.21;

2修改

--修改订单信息

IF OBJECT_ID (N'PROC_UPDATE_ORDER', N'P') IS NOT NULL

DROP procedure PROC_UPDATE_ORDER;

GO

CREATE procedure PROC_UPDATE_ORDER

@orderid  nvarchar(50),

@city nvarchar(20),

@price float

AS

UPDATE Orders SET OrderID=@orderid,City=@city,Price=@price;

GO

执行

EXEC PROC_UPDATE_ORDER N'LJ0001',N'ShangHai',37.21;

3删除

--修改订单信息

IF OBJECT_ID (N'PROC_DELETE_ORDER', N'P') IS NOT NULL

DROP procedure PROC_DELETE_ORDER;

GO

CREATE procedure PROC_DELETE_ORDER

@orderid  nvarchar(50),

AS

DELETE  FROM Orders WHERE OrderID=@orderid;

GO

执行

EXEC PROC_DELETE_ORDER N'LJ0001';

重复编译存储过程

--重复编译

IF OBJECT_ID (N'PROC_ORDER_WITH_RECOMPILE', N'P') IS NOT NULL

DROP procedure PROC_ORDER_WITH_RECOMPILE;

GO

CREATE procedure PROC_ORDER_WITH_RECOMPILE

with recompile --重复编译

AS

SELECT * FROM Orders;

GO

2加密存储过程

--查询存储过程,进行加密,加密后不能查看和修改源脚本

IF OBJECT_ID (N'PROC_ORDER_WITH_ENCRYPTION', N'P') IS NOT NULL

DROP procedure PROC_ORDER_WITH_ENCRYPTION;

GO

CREATE procedure PROC_ORDER_WITH_ENCRYPTION

with encryption --加密

AS

SELECT * FROM Orders;

GO

执行上述存储过程:

EXEC PROC_ORDER_WITH_ENCRYPTION

执行完的效果如图:

这就是存储过程的详细用法了,记得转发和收藏哦

SQL Server存储过程用法介绍的更多相关文章

  1. SQL Server存储过程多角度介绍

    什么是存储过程: 存储过程(Procedure)类似于C#语言中的方法,它是SQL语句和控制流语句的预编译集合.存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量.逻辑控制语句 ...

  2. SQL Server存储过程中使用表值作为输入参数示例

    这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...

  3. SQL Server存储过程的删除方法

    SQL Server存储过程的删除方法使我们经常会用到的,下面就为您介绍扩展存储过程的删除方法,如果您对SQL Server存储过程方面感兴趣的话,不妨一看. --清除SQL Server所有的危险扩 ...

  4. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  5. SQL Server 存储过程(转载)

    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...

  6. 14、SQL Server 存储过程

    SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...

  7. (摘录)SQL Server 存储过程

    文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...

  8. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

  9. Yii2.0调用sql server存储过程并获取返回值

    1.首先展示创建sql server存储过程的语句,创建一个简单的存储过程,测试用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE P ...

随机推荐

  1. 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

    基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...

  2. ubuntu 12.04 64位 安装wps

    1.去wps官网下载linux版的软件 http://community.wps.cn/download/ 我这里下载的是Alpha版的kingsoft-office_9.1.0.4280~a12p4 ...

  3. JVM虚拟机21: 1.8中废弃永久代(PermGen)迎来元空间(Metaspace)

    1.JDK8永久代的废弃 JDK8 永久代变化如下图: 1.新生代:Eden+From Survivor+To Survivor 2.老年代:OldGen 3.永久代(方法区的实现) : PermGe ...

  4. awk.md

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的行编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分 ...

  5. 3613: [Heoi2014]南园满地堆轻絮

    3613: [Heoi2014]南园满地堆轻絮 Time Limit: 50 Sec Memory Limit: 256 MB Submit: 827 Solved: 534 [Submit][Sta ...

  6. Apache HttpComponents中的cookie匹配策略

    Apache HttpComponents中的cookie匹配策略 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre. ...

  7. 通过应用程序域AppDomain加载和卸载程序集

    微软装配车的大门似乎只为货物装载敞开大门,却将卸载工人拒之门外.车门的钥匙只有一把,若要获得还需要你费一些心思.我在学习Remoting的时候,就遇到一个扰人的问题,就是Remoting为远程对象仅提 ...

  8. layer关闭当前窗口并刷新父窗口

    window.parent.location.reload(); var index = parent.layer.getFrameIndex(window.name); parent.layer.c ...

  9. GIt帮助文档之创建新的Git仓库——现有目录下,通过导入所有文件来创建

    1.新建仓库初始化操作 1.1打开Git Bash命令窗口,切换到项目文件夹目录: $ cd weixin 1.2执行命令: $ git init 初始化操作,把项目weixin纳入Git管理.初始化 ...

  10. 不安分的android开发者(小程序初尝试,前后台都自己做)

    前言 作为一个稍微有点想法的程序员来说,拥有一个自己开发,自己运营,完全属于自己的应用,应该是很多人的梦想.刚毕业那会,自己的工作是做游戏,于是也和朋友业余时间开发一些小游戏玩玩,可是终究不成气候,而 ...