sql server 中的存储过程
记录一下sql server 2008r2中的存储过程
一直在做项目,但是用到存储过程的时候少之又少,前段时间有幸用到了一下存储过程,当然只是sql server 中的存储过程,当然,这是我自己主动要写存储过程的,这里记录一下。
存储过程的优缺点,从网上找的写一下:
优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/defonds/archive/2009/07/15/4349922.aspx
缺点:
1. 运行速度: 大多数高级的数据库系统都有statement cache的,所以编译sql的花费没什么影响。但是执行存储过程要比直接执行sql花费更多(检查权限等),所以对于很简单的sql,存储过程没有什么优势。
2. 网络负荷:如果在存储过程中没有多次数据交互,那么实际上网络传输量和直接sql是一样的。
3. 团队开发:很遗憾,比起成熟的IDE,没有什么很好存储过程的IDE工具来支持,也就是说,这些必须手工完成。
4. 安全机制:对于传统的C/S结构,连接数据库的用户可以不同,所以安全机制有用;但是在web的三层架构中,数据库用户不是给用户用的,所以基本上,只有一个用户,拥有所有权限(最多还有一个开发用户)。这个时候,安全机制有点多余。
5. 用户满意:实际上这个只是要将访问数据库的接口统一,是用存储过程,还是EJB,没太大关系,也就是说,在三层结构中,单独设计出一个数据访问层,同样能实现这个目标。
6. 开发调试:一样由于IDE的问题,存储过程的开发调试要比一般程序困难(老版本DB2还只能用C写存储过程,更是一个灾难)。
7. 移植性:算了,这个不用提,反正一般的应用总是绑定某个数据库的,不然就无法靠优化数据库访问来提高性能了。
8. 维护性:的确,存储过程有些时候比程序容易维护,这是因为可以实时更新DB端的存储过程,但是在3层结构下,更新server端的数据访问层一样能实现这个目标,可惜现在很多平台不支持实时更新而已。
从上面可知道,存储过程的使用不能有死规定(全用,或全不用),以前Terminal - Server, Client-DB的方式已经过时了,存储过程很多优势已经不明显。
现在,我认为的原则是:所有数据访问在应用层封装为数据访问层,在那里,如果SQL简单的话,直接用SQL;如果SQL复杂,或者数据交互多且中间数据最后不会用到,使用存储过程。其他凭经验吧。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zy1691/archive/2009/01/09/3742780.aspx
上面都是从其他博主的博客上找的,之所以用存储过程,我觉得是解决一些特别复杂的sql 语句的,我直接写sql 语句不能够写出来,要是很简单的写出来,我干嘛要费尽的去写存储过程,虽然存储过程能够提高查询效率,但是对于没有写过的程序小白来说,第一次写总是有点困难,没事,写一次就会了一些基本的语法了,之后再写就会好一些。
USE [famsdb]
GO
ALTER PROCEDURE [dbo].[StoreProc]
@usercode varchar(100),
@corpcode varchar(50),
@suitecode1 varchar(50),
@suitecode2 varchar(50),
@suitecode3 varchar(50),
@suitecode4 varchar(50),
@score1 int=0 output,
@score2 int=0 output,
@score3 int=0 output,
@score4 int=0 output
AS
BEGIN
SET NOCOUNT ON;
SELECT @score1=FS_SCORE FROM ZZ_STATISTIC_FORM ZSF
INNER JOIN ZZ_SELFSTORE ZS
ON ZS.CORPCODE = ZSF.CORPCODE
INNER JOIN ZZ_SELFSTORE_MODEL ZSM
ON ZSM.SELF_STORE_ID = ZS.SELF_STORE_ID
WHERE ZSM.USERCODE = @usercode AND ZSF.CORPCODE = @corpcode AND ZSF.SUITECODE = @suitecode1
SELECT @score2=FS_SCORE FROM ZZ_STATISTIC_FORM ZSF
INNER JOIN ZZ_SELFSTORE ZS
ON ZS.CORPCODE = ZSF.CORPCODE
INNER JOIN ZZ_SELFSTORE_MODEL ZSM
ON ZSM.SELF_STORE_ID = ZS.SELF_STORE_ID
WHERE ZSM.USERCODE = @usercode AND ZSF.CORPCODE = @corpcode AND ZSF.SUITECODE = @suitecode2
SELECT @score3=FS_SCORE FROM ZZ_STATISTIC_FORM ZSF
INNER JOIN ZZ_SELFSTORE ZS
ON ZS.CORPCODE = ZSF.CORPCODE
INNER JOIN ZZ_SELFSTORE_MODEL ZSM
ON ZSM.SELF_STORE_ID = ZS.SELF_STORE_ID
WHERE ZSM.USERCODE = @usercode AND ZSF.CORPCODE = @corpcode AND ZSF.SUITECODE = @suitecode3
SELECT @score4=FS_SCORE FROM ZZ_STATISTIC_FORM ZSF
INNER JOIN ZZ_SELFSTORE ZS
ON ZS.CORPCODE = ZSF.CORPCODE
INNER JOIN ZZ_SELFSTORE_MODEL ZSM
ON ZSM.SELF_STORE_ID = ZS.SELF_STORE_ID
WHERE ZSM.USERCODE = @usercode AND ZSF.CORPCODE = @corpcode AND ZSF.SUITECODE = @suitecode4
select DISTINCT @score1 score1,@score2 score2,@score3 score3,@score4 score4,CORP.CORPNAME,CORP.CORPCODE,DDVOCATION.NAME
from CORP INNER JOIN DDVOCATION ON CORP.VOCATIONID = DDVOCATION.CODE WHERE CORP.CORPCODE = @corpcode
上面是存储过程,然而在调用的时候可以直接这样写:
(注意:在sql server中总是需要指定数据库,才能进行查询,不然会报错的。。。也只是要明白一些存储过程中的语法)
USE [famsdb]
Go
EXEC [dbo].[StoreProc] 'admin','','201812001','201712001','201612001','201512001'
这个东西我看起来都觉得很low,不过最终还是把那个问题解决了,优化的问题以后再说吧!

浙公网安备 33010602011771号