1

我想获取 XML 数据并将每个节点值插入到表的一行中。例如我有:

<Tags> 
    <Tag>a</Tag> 
    <Tag>b</Tag> 
    <Tag>c</Tag>
</Tags>

我想在一个名为Tags. 我该怎么做?

到目前为止我有这段代码,但我不知道如何@I在 xquery 部分中定义。顺便问一下,有没有更简单的方法?

CREATE TABLE #T (tag nvarchar(100))

DECLARE @TagsXML xml
DECLARE @TagsCount int
DECLARE @I int = 0

SET @TagsXML = '<Tags><Tag>a</Tag><Tag>b</Tag><Tag>c</Tag></Tags>'
SET @TagsCount = (SELECT T.x.value('count(Tag)', 'nvarchar(100)') FROM @TagsXML.nodes('Tags') T(x))

WHILE @I < @TagsCount
BEGIN
    INSERT INTO #T VALUES ((SELECT T.x.value('concat("Tag[", @I, "]")', 'nvarchar(100)') FROM @TagsXML.nodes('Tags') T(x)))
    SET @I = @I + 1
END

SELECT * FROM #T
4

1 回答 1

6

不要使用WHILE循环——分组思考!

您可以在单个语句中轻松完成此操作:

INSERT INTO #T(tag)
    SELECT
        XTags.value('.', 'nvarchar(100)')
    FROM 
        @TagsXML.nodes('/Tags/Tag') AS XTbl(XTags)

调用.nodes()为您提供了与此 XPath 表达式匹配的 XML 标记列表(作为 XML 片段)——在这里,您将获得所有<tag>元素的列表。从那个 XML 片段列表中,我选择唯一元素的内容作为nvarchar(100)并将其插入到表中。WHILE比带有循环的 RBAR(逐行痛苦)方法更有效、性能更好

于 2013-07-21T10:15:43.433 回答