L oop на XML данных - PullRequest
       21

L oop на XML данных

0 голосов
/ 27 февраля 2020

В моей SQL таблице серверов один столбец имеет тип данных XML. Он содержит данные в виде:

<P1>
<P2>
<P3 name='[1] name1', value='val1'> </P3>
<P3 name='[2] name2', value='val2'> </P3>
<P3 name='[3] name3', value='val3'> </P3>
</P2>
</p1>

Я выбираю имя1, имя2, имя3, используя запрос:

select top(1)
    col.value('(/P1[1]/P2[1]/P3/@name)[1]', 'VARCHAR(max)') as q1,
    col.value('(/P1[1]/P2[1]/P3/@name)[2]', 'VARCHAR(max)') as q2,
    col.value('(/P1[1]/P2[1]/P3/@name)[3]', 'VARCHAR(max)') as q3,

    FROM table

Как я могу l oop на эти данные, чтобы получить все имена. Что-то вроде:

declare @x=1
while @x<4:
begin
    select top(1)
        col.value('(/P1[1]/P2[1]/P3/@name)[@x]', 'VARCHAR(max)') as q@x
        from table
    set @x=@x+1
end

Также как l oop на том же XML, чтобы получить все значения?

1 Ответ

2 голосов
/ 27 февраля 2020

Я позволил себе сделать вашу XML стройной. SQL Сервер XQuery .nodes() и CROSS APPLY доставляют то, что вам нужно.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata)
VALUES
(N'<P1>
    <P2>
        <P3 name="[1] name1" value="val1">
        </P3>
        <P3 name="[2] name2" value="val2">
        </P3>
        <P3 name="[3] name3" value="val3">
        </P3>
    </P2>
</P1>');
-- DDL and sample data population, end

SELECT tbl.ID
    , c.value('@name','VARCHAR(30)') AS [name]
    , c.value('@value','VARCHAR(30)') AS [value]
FROM @tbl AS tbl
    CROSS APPLY tbl.xmldata.nodes('/P1/P2/P3') AS t(c);

Выход

+----+-----------+-------+
| ID |   name    | value |
+----+-----------+-------+
|  1 | [1] name1 | val1  |
|  1 | [2] name2 | val2  |
|  1 | [3] name3 | val3  |
+----+-----------+-------+
...