如何优化这个存储过程(在线等) 30skyairmj]

发布时间:2014-1-1 0:09:55编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"如何优化这个存储过程(在线等) 30skyairmj]",主要涉及到如何优化这个存储过程(在线等) 30skyairmj]方面的内容,对于如何优化这个存储过程(在线等) 30skyairmj]感兴趣的同学可以参考一下。

有两张表: A:A1   A2    a1   @b1@b4@b2 B:B1   B2    c1   b1    c2   b2    c3   b4 A1、A2、B1、B2是表中的字段名 A2是由B2字段的值通过'@'分割符连接起来 如何根据A1值查询出B1的值 ? 比如输入a1,那就要查询出c1、c4、c2(顺序也不能乱) 我现在是写了个存储过程,简化如下 CREATE PROC getB1(@A char(10),@B CURSOR OUTPUT) AS DECLARE @A2 VARCHAR(50) SELECT @A2= A2 FROM A WHERE A1=@A --查询出来A2的值,是@b1@b4@b2...这种形式的 --新建一个临时表,用来存储后面取得的B1值 CREATE #TEMP(D INT IDENTITY(1,1),              E CHAR(10),              F CHAR(10) NULL) DECLARE @G CHAR(10)  --存储每个分割出来的B2值 --下面的循环是用来分割@A2,并且将B1存入临时表 WHILE(CHARINDEX('@',@A2,2)-2>-1)  --判断分割后的字符串还有没有'@' BEGIN SET @G=SUBSTRING(@A,2,CHARINDEX('@',@A,2)-2)    --分割两个'@'之间的字符串 SET @A=SUBSTRING(@A,CHARINDEX('@',@A,2),LEN(A)-CHARINDEX('@',@A,2)+1)  --分割之后的字符串 INSERT INTO #TEMP(E) VALUES(SELECT @G,B1 FROM B WHERE B2=@G)  --将值存入临时表 END SET @G=SUBSTRING(@A,2,LEN(A)-1)   --把最后一个B2值也存入临时表 INSERT INTO #TEMP(E) VALUES(SELECT @G,B1 FROM B WHERE B2=@G) SET @B = CURSOR    --使用游标返回查询出的B1值 FORWARD_ONLY STATIC FOR SELECT F FROM #TEMP OPEN @B GO

创建一个返回表的函数 将@b1@b4@b2拆分到表中 然后与B表连接试试

创建一个返回表的函数 将@b1@b4@b2拆分到表中 这种和我的相比较优在哪里呢? ps:我的存储过程中写疏忽了两个地方   create #temp  ===>  create table #temp   INSERT INTO #TEMP(E) VALUES(SELECT @G,B1 FROM B WHERE B2=@G)   ===>   INSERT INTO #TEMP(E) SELECT @G,B1 FROM B WHERE B2=@G 望诸位海涵

哦 还有一个地方也是错的 就是存储过程的返回类型为cursor , 少了VARYING参数

hh

算了,结贴了


上一篇:请问sqlserver2000怎么实施可负载均衡的集群啊? 20vshanyiao]
下一篇:Drop Table之怪现状(走过路过,不要错过) 0

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款