📄 subject_38562.htm
字号:
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:郭文明 回复日期:2003-05-14 14:59:11
<br>内容:我帮你写了一个存储过程,输入参数,可以得到你要的值,不过这个存储过程的性能比较低,另外一个方案是可以避免游标,如果数据量不大,这个存储过程完全满足,如果数据量大可能性能较低。在此之前,先建立3个用于操作的表a,tmp1,tmp2,结构:存储过程如下:<BR>CREATE TABLE [dbo].[a] (<BR> [father] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,<BR> [son] [char] (10) COLLATE Chinese_PRC_CI_AS NULL <BR>) ON [PRIMARY]<BR>GO<BR><BR>CREATE TABLE [dbo].[tmp1] (<BR> [name1] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL <BR>) ON [PRIMARY]<BR>GO<BR><BR>CREATE TABLE [dbo].[tmp2] (<BR> [name2] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL <BR>) ON [PRIMARY]<BR>GO<BR><BR>存储过程如下:<BR>SET QUOTED_IDENTIFIER ON <BR>GO<BR>SET ANSI_NULLS OFF <BR>GO<BR><BR><BR><BR><BR><BR>--功能:实现父列,子列的父存在多少子列<BR>--日期:2003-05-14<BR>--作者:郭文明<BR>ALTER proc testFS<BR><BR>--输入参数<BR>@fatherC varchar(40)<BR>as<BR><BR><BR>declare @message varchar(200),--信息变量<BR> @count1 int, --第一个临时表的记录数<BR> @count2 int ,--第二个临时表的记录数<BR> @count int, --此祖宗的总子孙数<BR> @son1 varchar(50), --第一个临时表的儿子变量<BR> @son2 varchar(50) --第一个临时表的儿子变量<BR><BR>--给变量赋初值<BR><BR>set @count = 0 --此祖宗的总子孙数<BR>set @son1 = 0 --第一个临时表的儿子变量<BR>set @son2 = 0 --第一个临时表的儿子变量<BR>--先找出要计算子孙的父节点的儿子数是否为空<BR>select <BR> * <BR>from <BR> a where father = @fatherC<BR><BR>--如果为空<BR>if (@@rowcount = 0)<BR> begin<BR> select @message = '此父亲无子孙节点'<BR> set @count1 = 0 --第一个临时表的记录数<BR> set @count2 = 0--第二个临时表的记录数<BR> goto message<BR> end<BR>else<BR> begin<BR> --向临时表1添加第一级子孙<BR> insert into <BR> tmp1 <BR> select <BR> son <BR> from <BR> a<BR> where <BR> father =ltrim(rtrim(@fatherC))<BR> --计算第一级子孙个数<BR> select <BR> @count = count(*),@count1 = count(*)<BR> from <BR> tmp1<BR> <BR> --set @count1 = 1 --第一个临时表的记录数<BR> --set @count2 = 0--第二个临时表的记录数<BR> --*****************************************************************<BR> --作出循环,只要第一个临时表的记录数或第二个临时表的记录数大于零(不为空)<BR> while (@count1 > 0 or @count2 > 0)<BR> begin<BR> <BR> --写游标依次提出临时表1的记录(存放父亲的儿子节点名称),然后往临时表2中填入此父亲节点下的儿子节点<BR> <BR> DECLARE <BR> FS_cursor <BR> CURSOR FOR<BR> SELECT <BR> name1<BR> FROM <BR> tmp1<BR> --打开游标<BR> OPEN FS_cursor<BR> <BR> <BR> FETCH NEXT FROM FS_cursor<BR> INTO @son1<BR> <BR> --当取成功后<BR> WHILE @@FETCH_STATUS = 0<BR> BEGIN<BR> --向临时表2添加tmp1记录下的子孙<BR> insert into <BR> tmp2 <BR> select <BR> son <BR> from <BR> a<BR> where <BR> father = ltrim(rtrim(@son1)) <BR><BR><BR> FETCH NEXT FROM FS_cursor<BR> INTO @son1<BR> END<BR> <BR> CLOSE FS_cursor<BR> DEALLOCATE FS_cursor<BR><BR> --记count2的数目<BR> select <BR> @count2 = count(*)<BR> from <BR> tmp2 <BR> --得到总子孙数<BR> set @count = @count + @count2<BR> truncate table tmp1<BR><BR> --&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&<BR><BR> --写游标依次提出临时表2的记录(存放父亲的儿子节点名称),然后往临时表1中填入此父亲节点下的儿子节点<BR> <BR> DECLARE <BR> FS_cursor2 <BR> CURSOR FOR<BR> SELECT <BR> name2<BR> FROM <BR> tmp2<BR> --打开游标<BR> OPEN FS_cursor2<BR> <BR> <BR> FETCH NEXT FROM FS_cursor2<BR> INTO @son2<BR> <BR> --当取成功后<BR> WHILE @@FETCH_STATUS = 0<BR> BEGIN<BR> --向临时表2添加tmp1记录下的子孙<BR> insert into <BR> tmp1 <BR> select <BR> son <BR> from <BR> a<BR> where <BR> father = ltrim(rtrim(@son2)) <BR><BR><BR> FETCH NEXT FROM FS_cursor2<BR> INTO @son2<BR> END<BR> <BR> CLOSE FS_cursor2<BR> DEALLOCATE FS_cursor2<BR><BR> --记count1的数目<BR> select <BR> @count1 = count(*)<BR> from <BR> tmp1 <BR> --得到总子孙数<BR> set @count = @count + @count1<BR><BR> --清空tmp1的记录<BR> truncate table tmp2<BR><BR> continue<BR> end<BR> <BR> end<BR><BR><BR>--清空两个临时表<BR>truncate table tmp1<BR>truncate table tmp2<BR><BR>--总的子孙数<BR>print @count<BR><BR>message:<BR> raiserror 51002 @message<BR><BR><BR><BR><BR>GO<BR>SET QUOTED_IDENTIFIER OFF <BR>GO<BR>SET ANSI_NULLS ON <BR>GO<BR><BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:wanee 回复日期:2003-09-02 12:53:08
<br>内容:用oracle吧,一句sql(connect by) 就可以实现树状结构,:-)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -