Как извлечь данные из узлов XML в виде таблицы из столбца? - PullRequest
3 голосов
/ 30 июня 2019

У меня есть таблица в SQL Server со столбцом xml, и моя цель - извлечь все данные xml в виде таблицы.

Допустим, мой стол выглядит так:

CREATE TABLE Archive
(
    [Id] INT IDENTITY,
    [Timestamp] DATETIME,
    [XmlDoc] XML,
    [Description] NVARCHAR(150)
)

В столбце XmlDoc содержатся данные XML, подобные следующим:

<Documents>
  <Doc>
    <DocId>11111</DocId>
    <Status>1</Status>
    <DocType>DriverLicense</DocType>
    <ValidDate>2022-12-31</ValidDate>
  </Doc>
  <Doc>
    <DocId>22222</DocId>
    <Status>1</Status>
    <DocType>DriverLicense</DocType>
    <ValidDate>2022-07-16</ValidDate>
  </Doc>
  <Doc>
    <DocId>33333</DocId>
    <Status>2</Status>
    <DocType>DriverLicense</DocType>
    <ValidDate>2018-11-02</ValidDate>
  </Doc>
</Documents>

Мне нужно получить такой стол:

screenshot

Я пробовал что-то вроде

SELECT  
    XmlDoc.value('(/Documents/Doc/DocID)[1]', 'int') as [DocID],
    XmlDoc.value('(/Documents/Doc/Status)[1]', 'int') as [Status],
    XmlDoc.value('(/Documents/Doc/DocType)[1]', 'nvarchar(30)') as [DocType],
    XmlDoc.value('(/Documents/Doc/ValidDate)[1]', 'datetime') as [ValidDate]
FROM
    dbo.Archive

но возвращает только первый <Doc> узел каждого xml.

Можно ли получить каждый узел документа в виде отдельной строки?

1 Ответ

4 голосов
/ 30 июня 2019

Поскольку никто не ответил на мой вопрос, я сам нашел решение.Все, что вам нужно, это CROSS APPLY

SELECT 
    a.b.value('(DocId)[1]', 'int') as 'id', 
    a.b.value('(Status)[1]', 'int') as 'Status',
    a.b.value('(DocType)[1]', 'varchar(20)') as 'DocType',
    a.b.value('(ValidDate)[1]', 'varchar(20)') as 'ValidDate' 
FROM 
    dbo.Archive r
    CROSS APPLY r.XmlDoc.nodes('/Documents/Doc') a(b)

Может быть, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...