现有一父子结构的表(DimProblemType),如下所示:
物理字段名 |
逻辑字段名 |
数据类型 |
ProblemCode |
问题编码 |
int |
ProblemParentCode |
父问题编码 |
int |
ProblemName |
问题名称 |
nvarchar(50) |
数据如下所示:
ProblemCode |
ProblemParentCode |
ProblemName |
1 |
|
A |
2 |
1 |
B |
3 |
1 |
C
|
4 |
1 |
D |
5 |
2 |
E |
6 |
3 |
F |
7 |
4 |
G |
8 |
5 |
H |
9 |
6 |
I |
10 |
8 |
J |
1、给定一结点,选出所有的子结点如要显示ProblemCode为3的结点以及它的所有子结点,首创建一表值函数uf_GetSubNode,其函数代码如下:
CREATE FUNCTION [OLAP].[uf_GetSubNode] ( @problemCode int, -- 问题编码 @isLeaf int -- 是否只返回父结点 ) RETURNS @ProblemCodeTable TABLE ( [ProblemCode] int, [NodeLevel] int ) AS BEGIN DECLARE @level int SET @level = 1 INSERT INTO @ProblemCodeTable ([ProblemCode], [NodeLevel]) SELECT @problemCode, @level WHILE (@@ROWCOUNT > 0) AND (@isLeaf = 0) BEGIN SET @level = @level + 1 INSERT INTO @ProblemCodeTable ([ProblemCode], [NodeLevel]) SELECT A.[ProblemCode], @level FROM [BaseInfo].[DimProblemType] AS A, @ProblemCodeTable AS B WHERE (B.[NodeLevel] = @level - 1) AND (A.[ProbleParentCode] = B.[ProblemCode]) END RETURN END
GO
SELECT * FROM [OLAP].[uf_GetSubNode](3, 0)
|
返回的结果如下:
3 1
6 2
9 3
2、给定一结点,生成出它所在的路径如要显示ProblemCode为8的路径(A->B->E->H),首先创建一标量函数uf_GetPathString,其函数代码如下:
CREATE FUNCTION [OLAP].[uf_GetPathString] ( @problemCode int, -- 问题分类编码 @sign nvarchar(100) -- 各问题分类名称之间的分隔符 ) RETURNS nvarchar(4000) AS BEGIN DECLARE @pathString nvarchar(4000) SELECT @problemCode = [ProblemParentCode], @pathString = [ProblemName] FROM [BaseInfo].[DimProblemType] WHERE [ProblemCode] = @problemCode
WHILE @problemCode IS NOT NULL BEGIN DECLARE @temp nvarchar(200) SELECT @problemCode = [ProblemParentCode], @temp = [ProblemName] FROM [BaseInfo].[DimProblemType] WHERE [ProblemCode] = @problemCode
SET @pathString = @temp + @sign + @pathString END RETURN @pathString END
GO
SELECT [OLAP].[uf_GetPathString](8, N'->')
|
返回的结果如下:
A->B->E->H