正在阅读:UDF在层次型数据处理中的妙用之四UDF在层次型数据处理中的妙用之四

2004-04-01 13:27 出处:eNet硅谷动力 作者:仙人掌工作室 责任编辑:zwg
UDF在层次型数据处理中的妙用 四、查询管理链   至此为止,前面的所有例子都是用只返回一个值的数值型用户定义函数(UDF)。现在,我们来看看如何使用返回表的UDF。这类函数的返回值是一个记录集或表(即,可用于FROM子句)。例如,在处理层次结构的数据时,一个常见的需求是返回从指定管理员开始的整棵子树。 LISTING 6:获得整棵子树 CREATE FUNCTION ufn_GetSubtree ( @mgrid AS int ) RETURNS @tree table ( empid int NOT NULL, mgrid int NULL, empname varchar(25) NOT NULL, salary money NOT NULL, lvl int NOT NULL, path varchar(900) NOT NULL ) AS BEGIN DECLARE @lvl AS int, @path AS varchar(900) SELECT @lvl = 0, @path = '.' INSERT INTO @tree SELECT empid, mgrid, empname, salary, @lvl, '.' + CAST(empid AS varchar(10)) + '.' FROM Employees WHERE empid = @mgrid WHILE @@ROWCOUNT > 0 BEGIN SET @lvl = @lvl + 1 INSERT INTO @tree SELECT E.empid, E.mgrid, E.empname, E.salary, @lvl, T.path + CAST(E.empid AS varchar(10)) + '.' FROM Employees AS E JOIN @tree AS T ON E.mgrid = T.empid AND T.lvl = @lvl - 1 END RETURN END   Listing 6显示了创建ufn_GetSubtree函数的脚本。注意返回的表与原来的Employees表有着相同的结构,但增加了两个列:lvl和path。lvl列保存子树中从0开始计算的层次值,path列保存“.id0.id1...idn”格式的雇员管理路径。这个字符串包含从子树中最顶层的雇员开始、到当前的雇员为止的所有雇员ID。路径中所有雇员ID的前面和后面都是句点符号。   path列允许对本例中dbo.ufn_GetSubtree函数返回的子树的行进行适当的排序。对于特定的雇员来说,由于其所有下属的path值都以他的管理员的path值为前缀,排序中这些值能够正确地出现在它们的管理员之后。函数先把属于管理员的行插入@tree表变量(属于管理员的行在函数参数中指定)。接下来,函数开始一个循环,只要前一次插入操作有结果,迭代就一直进行。循环中的代码把前一次插入操作的直接下属追加到@tree表变量。上次插入的雇员的级别可以通过在@lvl变量中跟踪雇员在子树中的当前级别得到。
键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品