SQL函数的种类很多,实现的功能也不太一样。下面为您介绍的是用于遍历BOM表的SQL函数,希望可以让您对SQL函数有更多的了解。
表结构如下:
ptype subptype amount
a a.120
a a.2 15
a a.3 10
a. 1 a.1.1 20
a.1a.1.2 15
a.1 a.1.330
a.2 a.2.110
a.2 a.2.2 20
a.1.1 a.1.1.1 45
a.1.1 a.1.1.2 15
a.2.1 a.2.1.1 20
a.2.2 a.2.2.1 13
create table matgroup(parentgroup varchar(50),childgroup varchar(50), mount float) insert into matgroup select 'a', 'a.1',20 union select 'a', 'a.2', 15 union select 'a', 'a.3', 10 union select 'a.1', 'a.1.1', 20 union select 'a.1','a.1.2', 15 union select 'a.1', 'a.1.3',30 union select 'a.2', 'a.2.1',10 union select 'a.2', 'a.2.2', 20 union select 'a.1.1', 'a.1.1.1', 45 union select 'a.1.1', 'a.1.1.2', 15 union select 'a.2.1' ,'a.2.1.1', 20 union select 'a.2.2', 'a.2.2.1', 13
函数如下:
create FUNCTION fn_aaa (@matgroup varchar(50),@mount int ) RETURNS @retPLExpand TABLE (parentgroup varchar(50),childgroup varchar(50), mount float) AS BEGIN DECLARE @RowsAdded int declare @PLExpand Table (parentgroup varchar(50),childgroup varchar(50), mount float,processed tinyint default(0)) INSERT @PLExpand SELECT b.parentgroup,b.childgroup, @mount*b.mount, 0 FROM matgroup b WHERE b.parentgroup=@matgroup SET @RowsAdded = @@rowcount -- While new employees were added in the previous iteration WHILE @RowsAdded > 0 BEGIN /*Mark all employee records whose direct reports are going to be found in this iteration with processed=1.*/ UPDATE @PLExpand SET processed = 1 WHERE processed = 0 -- Insert employees who report to employees marked 1. INSERT @PLExpand SELECT a.parentgroup,a.childgroup,a.mount*b.mount , 0 FROM matgroup a inner join @PLExpand b on a.parentgroup=b.childgroup where b.processed = 1 SET @RowsAdded = @@rowcount /*Mark all employee records whose direct reports have been found in this iteration.*/ UPDATE @PLExpand SET processed = 2 WHERE processed = 1 END -- copy to the result of the function the required columns INSERT @retPLExpand SELECT parentgroup,childgroup,mount FROM @PLExpand RETURN END
调用方法如下:
select * from fn_aaa('a.1')
意思是找出a.1下的所有儿子及孙子.