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