由存储过程谈“配角”

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

51Testing软件测试网@&pnWP!\ein

  存储过程是一组预先编译好的sql语句。将他放在服务器上面,由用户通过指定存储过程的名字来执行它。51Testing软件测试网&S+jho)iIHT

e&R `}5WKR6k\ Bi0  存储过程的优点:

{SM:?NTE0

1N/f }B,ryVQ.N0  封装——可用于操作数据库对象的方法,用户只需要知道它的输入输出参数并理解其目的即可。

$Bs%~+vcan%J051Testing软件测试网;lF5^'j4tF

  改善性能——已经预先编译51Testing软件测试网7e]4}F)O

51Testing软件测试网%Vm5|;rs~Q

  减少网络流量——只返回最后的结果集

e)Y,O+nfw0

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

8_&xa!fC-VG6|4m7z/\0

p;] W U]'w1H0  安全性——如果数据库拥有者DBO或者系统管理员SA编译并保存了存储结构,存储过程就有了对它使用的数据库对象的所有访问权限。因此系统管理员可以向单独的用于授予对数据对象的最小访问权限,而不是直接允许用户使用数据库对象。

4G\*l[O(kqK0

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

['G(eiKAZ2]h0

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

p;W1C,Q(}eO5s0
51Testing软件测试网h O4[7b3v4M4yW

<SPAN style="FONT-SIZE: 24px">CREATE PROCEDURE [dbo].[procCardByMore]</SPAN>
$C ^nII1H8d-XYF0 @cardNo varchar (50),
ZR }X~$Q;[*C0 @TeacherID varchar(50),
2^ uhU0}(P$r+T0 @Name varchar(50),
sNX `-\Xe0 @telephone varchar(50) 
'JM[2HXI;`0AS51Testing软件测试网8`3d}9H6v x
DECLARE @sql varchar(1000)51Testing软件测试网"Y)D8Uq%f1C}
SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话 FROM view_CardDetail '

3yc2q5|W~'T)GJ_'T0

R(G [6j$A;s7E vq0IF(@cardNo <>'')
[&FV7Iz ioZD]E0BEGIN51Testing软件测试网3Q}5jB*sa!W}7FX
SET @sql=@sql+'and  cardNo='''+@cardNo+''''51Testing软件测试网r!i)Y2O;I(^2D
END
51Testing软件测试网5X3V D1|+ab3O#V,EU

51Testing软件测试网s6X ^Kw

IF(@TeacherID <>'')
"O8`RF~0DO.URg0BEGIN51Testing软件测试网g?'M!L i;H'pml2d_
SET @sql=@sql+'and  TeacherID='''+@TeacherID+''''51Testing软件测试网.J@%|(g&\7R&|
END
51Testing软件测试网 V,@$D3D/m!sE

e]D?YD0IF(@Name <>'')
0Y.VO[O0BEGIN
/u@"Fg/[I2^0SET @sql=@sql+'and  Name='''+@Name+''''51Testing软件测试网7F$gQ*Y2A_
END
51Testing软件测试网8ec Fq;z8pR3Mv

!`pc+Q3t6k2l d0IF(@Name <>'')51Testing软件测试网[rOA~
BEGIN51Testing软件测试网{1Q8`a/u r.fr]
SET @sql=@sql+'and  telephone='''+@telephone+''''
.o4d"A/xT#\0END

r;{aC)mJ0

plx7Dk0exec(@sql)

@4pq1yr%j/b0
51Testing软件测试网U[7S'i}8tE

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

"Q} Q"wyyO/D"\0
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软件测试网 d|j1r1T^

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

lC#c7Z6J"N!X6S\e051Testing软件测试网I%^(r1dD*V$f G2L.g

CREATE PROCEDURE [dbo].[procCardByMore]51Testing软件测试网/?&IfUIU _(bXX @ O
 @cardNo varchar (50),
XO:KM8I0 @TeacherID varchar(50),51Testing软件测试网:`&xMOC0u` \
 @Name varchar(50),51Testing软件测试网y!qp2L"FK2z
 @telephone varchar(50) 51Testing软件测试网&pY` V'rV-t l!h I[
AS
$jwC.^1mI+j0DECLARE @sql varchar(1000)
4w;Fy6M'v\%kM A6Z0\ }S0SET @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 '

y7fY!?7?y)A051Testing软件测试网8o0IU&?K^X

IF(@cardNo <>'')51Testing软件测试网#?tP8O4Y&p[QB-pM
BEGIN51Testing软件测试网+v2?/C8AN/H
SET @sql=@sql+'and  cardNo='''+@cardNo+''''
3m]d:d URV|0END

C P)xuEK)?051Testing软件测试网a?*l)b ~{0wN8G

IF(@TeacherID <>'')
wFgAm _u0BEGIN51Testing软件测试网0bM"F6]{C3N#F
SET @sql=@sql+'and  TeacherID='''+@TeacherID+''''
N1qRs0D2k E0END
51Testing软件测试网,? lf5k8_Wq)a h

51Testing软件测试网[n*_"fi8bx%M

IF(@Name <>'')
P'E6a|:Z r-W)k zD/tb0BEGIN
)M tF7gET+c0SET @sql=@sql+'and  Name='''+@Name+''''51Testing软件测试网 `Sk#Gsici
END
51Testing软件测试网y1I2B&\sb0AT

51Testing软件测试网![5m7] kW;TO

IF(@Name <>'')51Testing软件测试网 _ BV6bO}x5|
BEGIN
h\f"@u#Qj }L2E0SET @sql=@sql+'and  telephone='''+@telephone+''''51Testing软件测试网 T/`9am8H^
END
51Testing软件测试网"Z P'AW6u4m

kP)x\4Q ~{%R a6F*G0exec(@sql)

k}l8BH3N`051Testing软件测试网)W$~xw$R ^ c@`y(d+D

  这样的话执行出来的结果是这样的:

0i,lw#M$J*b051Testing软件测试网dpUB$sQ9iY

51Testing软件测试网 q,E:@4mW:X

SELECT TeacherID as 教师编号,Nameas 教师姓名,GradeName as 所属年级,cardNo as 卡号,cashas 卡内余额,realName as 管理员,OpenTime as 开卡时间,stateas 状态,telephone as 联系电话FROM view_CardDetail WHERE 1=1and  cardNo='+@cardNo+'

2GC@1f"T4H0  必然条件在这里充当了桥梁的作用,虽然我们没有“1=1“的需求,但是它的存在却恰好解决了两者互不相容的尴尬局面。51Testing软件测试网1B&o.df.W

x#qldB+hs&x0  受上面的启发,下面的情况是这样解决的:

QT#j4n+EtCI!E051Testing软件测试网:Fq4TC%kc

  需要根据教师编号和起始日期查询教师的消费记录情况,两个条件的存在情况各自随便。

IR2FmE$g0

H#OB9@3LEF0  存储过程代码如下:51Testing软件测试网ibX8|.o3J%V5I4_

OK6rl9H*bm0

9_|xBN0
51Testing软件测试网c+zA#Pc8f

CREATE PROCEDURE [dbo].[procConsumeByMore]
6W)S7U0w L5b0 @TeacherID varchar(50),51Testing软件测试网3l} iM@\[y_
 @TimeStart datetime,51Testing软件测试网f3SW\${A
 @TimeEnd datetime
V4Nnwl1X yr0AS
P,pk:\/PW"x0DECLARE @sql varchar(1000)
G7}P2p _!PE0SET @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 '
51Testing软件测试网1z;t#G T&f o

%v]j0})i.jw/f)o&L-w0
2{q$_Od0IF(@TeacherID <>'')51Testing软件测试网n zwP9`4aT+QP
BEGIN
8H:dJR s[Y(Q[0SET @sql=@sql+'and  TeacherID='''+@TeacherID+''''51Testing软件测试网5[7|0E O R)`,xiL8e
END

:R RG"b+aCtM0

SJ!^+x*T;o)H8J0IF( @TimeStart<>null and @TimeEnd<>null)51Testing软件测试网6z"e bL o9Sl6Zh"b
BEGIN51Testing软件测试网(? Wpc8T_
SET @sql=@sql+'and  consumeTime between'''+@TimeStart+''' and'''+@TimeEnd+''''
M4qOlT6H.]Y QU0END

7n6g `,J-? p051Testing软件测试网i%D5qY"V+n

exec(@sql)51Testing软件测试网6E1["S8x}B

51Testing软件测试网'F9\+` W&pD4B9@"c

  这里当@TimeStart和@TimeEnd为空的时候,空字符串不能转换成日期类型,这时候假如两个变量为空,我可以给他们赋一个完全的值:

-wV]x j"V0

^1h,\4\2b TS VH051Testing软件测试网,K D Z K0H5K

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

vC(Hfq2nku0  如上面的代码就可以选择出所有的消费记录了。

0~$as#q(GUv b)h0

K!YRtic|k*~X0  上面两件事情中必然事件这个配角起了不可忽视的作用,然而必然事件却不是我们在查询过程中需要的条件。51Testing软件测试网4W uw+`(|l6@_

51Testing软件测试网G&`+U%H&h(l6e|#{ |

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


TAG:

 

评分:0

我来说两句

Open Toolbar