当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 15:21:00  来源:本站整理

UDF在层次型数据处理中的妙用之五[MSSQL防范]

赞助商链接



  本文“UDF在层次型数据处理中的妙用之五[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
UDF在层次型数据处理中的妙用  

  要得到Andrew子树中的叶节点(不是管理员的雇员),查询号令以下:

SELECT * FROM ufn_GetSubtree(2) AS S
WHERE NOT EXISTS(SELECT * FROM Employees AS E
WHERE E.mgrid = S.empid)

  最后一个任务是操纵Listing 7显示的ufn_GetMgmtChain函数,报告通向特定雇员的管理链.


LISTING 7:获得通向特定雇员的管理链

CREATE FUNCTION ufn_GetMgmtChain
(
@empid 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
)
AS

BEGIN

DECLARE @lvl AS int
SET @lvl = 0

INSERT INTO @tree
SELECT empid, mgrid, empname, salary, @lvl
FROM Employees
WHERE empid = @empid

WHILE @@ROWCOUNT > 0
BEGIN
SET @lvl = @lvl + 1

INSERT INTO @tree
SELECT E.empid, E.mgrid, E.empname, E.salary, @lvl
FROM Employees AS E JOIN @tree AS T
ON E.empid = T.mgrid AND T.lvl = @lvl - 1
END

RETURN

END


  注意ufn_GetMgmtChain函数的实现与ufn_GetSubtree函数的实现类似,辨别在于目前我们顺着管理链而上,直至到达顶端.要得到通向James(empid是14)的管理链,可以履行以下查询:


SELECT * FROM ufn_GetMgmtChain(14)
ORDER BY lvl DESC


  从SELECT查询的性能考虑,我们可以把lvl和path列的值直接加入到Employees表,然后通过触发器更新这两个列的值.采取这种办法要比在UDF中计算lvl和path值更有利于提高查询的性能.假如要利用一个用到了lvl列和path列的过滤器,ufn_GetSubtree必须先扫描整个表,计算这两个列的值.假如让lvl和path作为Employees表的列,我们可以在path列上成立一个索引,从而避免对整个表的扫描操作.但是,利用ufn_GetSubtree函数时,我们无需对Employees的构造做任何改正,并且和利用触发器时差别,我们不会增添任何保护lvl和path列的负担.UDF的呈现拓展了无限的编程空间.在这里,UDF是不要求对表的构造做任何改正的强盛层次型数据处理工具.   以上是“UDF在层次型数据处理中的妙用之五[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • UDF在层次型数据处理中的妙用之一
  • UDF在层次型数据处理中的妙用之二
  • UDF在层次型数据处理中的妙用之三
  • UDF在层次型数据处理中的妙用之四
  • UDF在层次型数据处理中的妙用之五
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .