使用函数选择分层项

时间:2012-07-05 04:44:01

标签: sql hierarchical-data

我试图从表中生成Html。为实现这一目标,我使用了函数。

表格

LayoutId        LayoutDetailsId ParentId        DetailSyntax    DetailValue
--------------- --------------- --------------- --------------- ---------------
2               15              0               table           htmlchild
2               16              15              tbody           htmlchild
2               17              16              tr              htmlchild
2               18              17              th              No.
2               19              17              th              Name
2               20              17              th              Address
2               21              16              tr              htmlchild
2               22              21              td              1
2               23              21              td              Asha
2               24              21              td              Flamboyan Street
2               25              16              tr              htmlchild
2               26              25              td              2
2               27              25              td              Jack
2               28              25              td              Manggo Street

请注意,DetailValue中的htmlchild就像“HasChild”

功能:

CREATE FUNCTION FnHtmlGenerator(@layoutId BIGINT, @parentId BIGINT = 0, @prevTopLevelHtml VARCHAR(MAX) = '')
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @currentHtml VARCHAR(MAX);
    DECLARE @parentTable TABLE
    (
        layoutDetailsId BIGINT,
        parentId BIGINT,
        syntax VARCHAR(50),
        val VARCHAR(50)
    );

    INSERT INTO @parentTable
    SELECT
        ld.LayoutDetailsId,
        ld.ParentId,
        ld.DetailSyntax,
        ld.DetailValue
    FROM Alert.LayoutDetails ld
    WHERE ld.ParentId = @parentId
    AND ld.LayoutId = @layoutId;

    SELECT
        @currentHtml = '<' + pt.syntax + '>{0}</' + pt.syntax + '>',
        @parentId = pt.layoutDetailsId
    FROM @parentTable pt;

    SELECT
        @prevTopLevelHtml =
        CASE CHARINDEX('{0}', @prevTopLevelHtml)
            WHEN 0 THEN @currentHtml
            ELSE STUFF(@prevTopLevelHtml, CHARINDEX('{0}', @prevTopLevelHtml), 3, @currentHtml)
        END;

    SELECT
        @prevTopLevelHtml =
        CASE
            (SELECT COUNT(0)
            FROM Alert.LayoutDetails ld
            WHERE ld.ParentId = @parentId)
            WHEN 0 THEN @prevTopLevelHtml
            ELSE FnHtmlGenerator(@layoutId, @parentId, @prevTopLevelHtml)
        END;

    RETURN @prevTopLevelHtml;
END

结果:

html
---------------------------------------------------
<table><tbody><tr><td>{0}</td></tr></tbody></table>

问题是。我的功能只跟踪1路径。不跟踪第一个tr和第一个td偶数th。如何让它追踪所有路径?

1 个答案:

答案 0 :(得分:1)

因为当你打电话

SELECT 
    @currentHtml = '<' + pt.syntax + '>{0}</' + pt.syntax + '>', 
    @parentId = pt.layoutDetailsId 
FROM @parentTable pt; 

...返回表格中的最后一行,并将其分配给变量,因此路径为2/15/16/25/28

您可能希望查看公用表表达式的递归功能(例如:http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx)和/或分层数据类型(如果您的数据库平台支持它)(SQL Server 2008 +,)