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

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

有两张表: A:A1   A2    a1   @[email protected]@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 [email protected] --查询出来A2的值,[email protected]@[email protected]..这种形式的 --新建一个临时表,用来存储后面取得的B1值 CREATE #TEMP(D INT IDENTITY(1,1),              E CHAR(10),              F CHAR(10) NULL) DECLARE @G CHAR(10)  --存储每个分割出来的B2值 [email protected],并且将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 [email protected])  --将值存入临时表 END SET @G=SUBSTRING(@A,2,LEN(A)-1)   --把最后一个B2值也存入临时表 INSERT INTO #TEMP(E) VALUES(SELECT @G,B1 FROM B WHERE [email protected]) SET @B = CURSOR    --使用游标返回查询出的B1值 FORWARD_ONLY STATIC FOR SELECT F FROM #TEMP OPEN @B GO

创建一个返回表的函数 [email protected]@[email protected] 然后与B表连接试试

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

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

hh

算了,结贴了

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

相关文章

相关评论