由存储过程谈“配角”

上一篇 / 下一篇  2012-07-19 09:27:44 / 个人分类:数据库

-C_E!KnK+N0  存储过程是一组预先编译好的sql语句。将他放在服务器上面,由用户通过指定存储过程的名字来执行它。51Testing软件测试网eE+}GG

2V;O3C-kX^&R0  存储过程的优点:51Testing软件测试网E_f v"WX

51Testing软件测试网5J8T%Uy!j$y,[Z/Z

  封装——可用于操作数据库对象的方法,用户只需要知道它的输入输出参数并理解其目的即可。

,Xy7Cja Md }0

&@~/RJ$`0  改善性能——已经预先编译

k _YrEh]2[0

1W`re,]xg0  减少网络流量——只返回最后的结果集

e y:ax})kX/V {3P051Testing软件测试网 u vEuw

  重要性——针对复杂逻辑,应用已经测试号的存储过程,不容易发生错误。

P M4uI&r7wYc051Testing软件测试网1z0o:@ ^:TH5]

  安全性——如果数据库拥有者DBO或者系统管理员SA编译并保存了存储结构,存储过程就有了对它使用的数据库对象的所有访问权限。因此系统管理员可以向单独的用于授予对数据对象的最小访问权限,而不是直接允许用户使用数据库对象。51Testing软件测试网;wE/_z3c,^D&u

51Testing软件测试网#|s7["t u$ns

  这次项目开发中运用了不少的存储过程,中间遇到了一个小问题,大家可以看看:

_9W;a:Ip"c0

3D_pM2c*jNV7mw0  事情是这样的:我想根据卡号、教师编号、教师姓名、联系电话这四个条件查询教师编号,这四个条件可以不存在,可以只存在一个,可以只存在两个,可以只存在三个,可以存在四个。开始我写的存储过程是这样的

dH!oP;w&Q0

?%KIa|-iMi0<SPAN style="FONT-SIZE: 24px">CREATE PROCEDURE [dbo].[procCardByMore]</SPAN>51Testing软件测试网K!x$PJVi:t
 @cardNo varchar (50),51Testing软件测试网X*T,y)JA.a HK I
 @TeacherID varchar(50),51Testing软件测试网 Z3R!Mp7vS2]*O
 @Name varchar(50),
sM7F;zI4X}hXO0 @telephone varchar(50) 
Z P N*x#I.j%T+xHR0AS51Testing软件测试网)C*T9yV`.Qo9_'M
DECLARE @sql varchar(1000)51Testing软件测试网s;?H*X}R#\T5Cp
SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话 FROM view_CardDetail '
51Testing软件测试网c;qC5u|-Qi|K

51Testing软件测试网q RC&`Zx"B

IF(@cardNo <>'')51Testing软件测试网;q }DO+o,@Kdc
BEGIN
@&~ ?l|0d0SET @sql=@sql+'and  cardNo='''+@cardNo+''''51Testing软件测试网 j@;xdmXe
END

oSZ,\L\%gF0

"`dm)V7R1jz0IF(@TeacherID <>'')
_;A%yED)|}sU0BEGIN51Testing软件测试网*s~ `3f7Ms
SET @sql=@sql+'and  TeacherID='''+@TeacherID+''''51Testing软件测试网e q$hudIh
END
51Testing软件测试网M{1C | w4KN2n

51Testing软件测试网D VC!@ l T/t$Y

IF(@Name <>'')51Testing软件测试网Q+e`ld7ToX
BEGIN
~NA,k}3p0SET @sql=@sql+'and  Name='''+@Name+''''
&Z|#mH0n'i0END

|;Nf0o!\~A0

3}E:_vj PV+@0IF(@Name <>'')51Testing软件测试网 IaRWS_4o,Qx?
BEGIN
M)SG$a+We0SET @sql=@sql+'and  telephone='''+@telephone+''''51Testing软件测试网1k&~ E W(o)a
END
51Testing软件测试网_-RxcB$t#K9e"N

M9r z_-Sf M n0exec(@sql)51Testing软件测试网9Ch"oF1oG-?

51Testing软件测试网ze)Y&C'ml9O~j

  这里面假如卡号不为空的话,那么写出来的sql语句是这样的:

B5G$];snh0
SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话FROM view_CardDetail and  cardNo='@cardNo’
51Testing软件测试网"DIvw)K

  这句话显然是错误的,在查询语句和条件的过渡的地方没有where,而是突然来了个and。然而这个时候如果加上个必然条件那就完美了,接下来的存储过程创建语句是这样的:51Testing软件测试网\r*Qcpxn

51Testing软件测试网8k%U#s+pN&Z6L

CREATE PROCEDURE [dbo].[procCardByMore]51Testing软件测试网hI4bop
 @cardNo varchar (50),51Testing软件测试网O$p,e7`&G
 @TeacherID varchar(50),
1O3@A]l$F-f7q0 @Name varchar(50),51Testing软件测试网k~!Z]n-?
 @telephone varchar(50) 51Testing软件测试网2@5^&n-B$K i
AS51Testing软件测试网,yu$|;aEc&T
DECLARE @sql varchar(1000)
ZP0H-}x`$sau0SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话FROM view_CardDetail WHERE 1=1 '

.A\Xnk0

3g"UF"v4o2pqr&O0@^0IF(@cardNo <>'')
;Z]mp.~ dMug0BEGIN
+DG4Wd q tU|0SET @sql=@sql+'and  cardNo='''+@cardNo+''''51Testing软件测试网zD G;l8t
END

e+{7bVn}5Cz051Testing软件测试网4C0m0Rk7B^

IF(@TeacherID <>'')51Testing软件测试网,j/}0D"F2m D$~3BN^6N
BEGIN
P-Se])G)a m0SET @sql=@sql+'and  TeacherID='''+@TeacherID+''''51Testing软件测试网0{rNB4j"V};wNC4t _
END
51Testing软件测试网2_o'`0mKx;N?l'K Y

51Testing软件测试网dxJ,W@

IF(@Name <>'')
8WE)G)me`;f;H0BEGIN
W d/|*k2B)O0SET @sql=@sql+'and  Name='''+@Name+''''51Testing软件测试网 U'[GxqL4U
END
51Testing软件测试网2W6Bsx%S4J|(T.Z

p h lj}M0IF(@Name <>'')51Testing软件测试网(\q-WW.{x
BEGIN51Testing软件测试网v FjWBB.v(CQ7Qc
SET @sql=@sql+'and  telephone='''+@telephone+''''51Testing软件测试网 D;V&i ay"Z:}V
END
51Testing软件测试网-V:bfI i

^B_@u(^}']o,A%s0exec(@sql)51Testing软件测试网 t_#Nzi,ab+y OQ

51Testing软件测试网sus9H"f

  这样的话执行出来的结果是这样的:51Testing软件测试网5BP1m1H%U,w

51Testing软件测试网5@ o;[M,\ i

51Testing软件测试网1@#_f9c c(d

SELECT TeacherID as 教师编号,Nameas 教师姓名,GradeName as 所属年级,cardNo as 卡号,cashas 卡内余额,realName as 管理员,OpenTime as 开卡时间,stateas 状态,telephone as 联系电话FROM view_CardDetail WHERE 1=1and  cardNo='+@cardNo+'
51Testing软件测试网[ @7ub4N'Af T

  必然条件在这里充当了桥梁的作用,虽然我们没有“1=1“的需求,但是它的存在却恰好解决了两者互不相容的尴尬局面。51Testing软件测试网w.uR6e;C jE ]

%`Zf,j"xq0  受上面的启发,下面的情况是这样解决的:

k I2o y@(O d0

!y5T,Q b"^0C Z:m0  需要根据教师编号和起始日期查询教师的消费记录情况,两个条件的存在情况各自随便。51Testing软件测试网I+q&MvCL&@

51Testing软件测试网y1bF so"j

  存储过程代码如下:51Testing软件测试网3@/U,e5_q

3Izzi8\u051Testing软件测试网"k(C+fy?$]2H;|,[

51Testing软件测试网{h&L'M-~,p

CREATE PROCEDURE [dbo].[procConsumeByMore]
.Md[/w*{K{#M1~0 @TeacherID varchar(50),
s]K:JyZ%Oe1O#K-b dO0 @TimeStart datetime,51Testing软件测试网N!iNA.L D
 @TimeEnd datetime
[h!J7X {}0AS
$QRdQ;\^e0DECLARE @sql varchar(1000)51Testing软件测试网!AdjO.n+`|-wF;Q
SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,orderID as 订单编号,adultNum as 成人数量,childNum as 儿童数量,consumeCash as 消费金额,consumeTime as 消费时间,userID as 管理员编号,realName as 管理员姓名FROM view_consumeDetail WHERE 1=1 '

5c;_o*\b2H9k0

-~ {cX3l4W?t0
[(zf;Kxy0IF(@TeacherID <>'')51Testing软件测试网3jg;D8y.fZ ^
BEGIN51Testing软件测试网*~]1h:^.?:{!\;a B!_Y
SET @sql=@sql+'and  TeacherID='''+@TeacherID+''''51Testing软件测试网X O$n)n)QMY"DQ
END

-E9OgV;n g }0

wo bi sR0IF( @TimeStart<>null and @TimeEnd<>null)51Testing软件测试网'Y.d hP| Tgp(gHD
BEGIN
_sYGs#Ng*u0SET @sql=@sql+'and  consumeTime between'''+@TimeStart+''' and'''+@TimeEnd+''''51Testing软件测试网?C T,RO C'}
END
51Testing软件测试网*z nM3q {3b ysx;Z8r

/T[y!b;E0exec(@sql)51Testing软件测试网0?zU9}p.c2bP

:biQTr0  这里当@TimeStart和@TimeEnd为空的时候,空字符串不能转换成日期类型,这时候假如两个变量为空,我可以给他们赋一个完全的值:51Testing软件测试网1H.NtFfVO$ljDY"s

51Testing软件测试网*Y z"N$nA6k

51Testing软件测试网pi/H#\m:l T z

exec procConsumeByMore '', '1799-01-01','9999-12-29'

_4sf)gVi ?!oKl0  如上面的代码就可以选择出所有的消费记录了。51Testing软件测试网5\2Gr)I8`p+K

51Testing软件测试网t4y5f,N%@

  上面两件事情中必然事件这个配角起了不可忽视的作用,然而必然事件却不是我们在查询过程中需要的条件。51Testing软件测试网wm"Ta Vj| m

51Testing软件测试网X5L?3r }*y6\.K@

  生活中配角并不意味着无趣和呆板,配角一样可以灵动,只是它把对别人的善意放在第一位,不把张扬作为表达自己的方式。‘上善若水,水善利万物而不争’,但是水又无处不在,其实就是这样一种状态。创造一个最好的配角,并不比创造一个主角容易。

$iFPe/G+q0

TAG:

 

评分:0

我来说两句

Open Toolbar