Вставьте узлы XML в таблицу в SQL Server

Я хочу получить данные XML и вставить каждое значение узла в строку таблицы. Например у меня есть:

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

и я хочу вставить a, b и c в таблицу с именем 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

1 ответ

Решение

Не использовать WHILE петли - думай в наборах!

Вы можете сделать это легко в одном утверждении:

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

Призыв к .nodes() дает вам список тегов XML, которые соответствуют этому выражению XPath (как фрагменты XML) - здесь вы получите список всех <tag> элементы. И из этого списка фрагментов XML я выбираю содержимое единственного элемента как nvarchar(100) и вставьте его в стол. Намного более эффективный и намного более эффективный, чем подход RBAR (строка за агонизирующей строкой) с WHILE петля

Другие вопросы по тегам