1

テーブルから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はトレースされません。すべてのパスをトレースする方法は?

4

1 に答える 1

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 以降)

于 2012-07-05T08:06:46.563 に答える