Разбор XML и вывод в хранимой процедуре в SQL Server - PullRequest
0 голосов
/ 18 сентября 2019

Вот схема XML:

<details schemaVersion="1">
  <dataWarning>
    <Locations>
      <Failed_to_Create LocationID="1234">Location<Location_Description>TEST</Location_Description><FacilityID>TEST</FacilityID><Active>Y</Active></Failed_to_Create>
    </Locations>
  </dataWarning>
</details>

Как разобрать XML, чтобы иметь возможность отображать его в хранимой процедуре?

Спасибо!

enter code here

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Андреа, тебе нужно быть более дисциплинированным.Вы несете ответственность за предоставление DDL и выборки данных.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE  (ID INT IDENTITY(1,1) PRIMARY KEY, Details XML);
INSERT INTO @tbl (Details)
VALUES
(N'<details schemaVersion="1">
  <dataWarning>
    <Locations>
      <Failed_to_Create LocationID="1234">Location<Location_Description>TEST</Location_Description><FacilityID>TEST</FacilityID><Active>Y</Active></Failed_to_Create>
    </Locations>
  </dataWarning>
</details>')
, (N'<details schemaVersion="1">
  <dataWarning>
    <Locations>
      <Failed_to_Create LocationID="5678">Location<Location_Description>Real Description</Location_Description><FacilityID>770</FacilityID><Active>N</Active></Failed_to_Create>
    </Locations>
  </dataWarning>
</details>');
-- DDL and sample data population, end

SELECT c.value('@LocationID', 'VARCHAR(10)') AS [locationID]
    , c.value('(Location_Description/text())[1]', 'VARCHAR(100)') AS [Location_Description]
    , c.value('(FacilityID/text())[1]', 'VARCHAR(100)') AS [FacilityID]
    , c.value('(Active/text())[1]', 'VARCHAR(100)') AS [Active]
FROM @tbl AS tbl
      CROSS APPLY tbl.Details.nodes('/details/dataWarning/Locations/Failed_to_Create') AS t(c);

Вывод

+------------+----------------------+------------+--------+
| locationID | Location_Description | FacilityID | Active |
+------------+----------------------+------------+--------+
|       1234 | TEST                 | TEST       | Y      |
|       5678 | Real Description     | 770        | N      |
+------------+----------------------+------------+--------+
1 голос
/ 19 сентября 2019

Использование метода Xquery node ().Он позволяет получить доступ к любому элементу или атрибуту.

SQL

DECLARE @xml XML = N'<Failed_to_Create LocationID="">Location
    <Location_Description>TEST</Location_Description>
    <FacilityID>TEST</FacilityID>
    <Active>Y</Active>
</Failed_to_Create>';

SELECT c.value('(./text())[1]', 'VARCHAR(10)') AS [location]
    , c.value('(Location_Description/text())[1]', 'VARCHAR(100)') AS [Location_Description]
    , c.value('(FacilityID/text())[1]', 'VARCHAR(100)') AS [FacilityID]
    , c.value('(Active/text())[1]', 'VARCHAR(100)') AS [Active]
FROM @xml.nodes('/Failed_to_Create') AS t(c);

Вывод

+------------+----------------------+------------+--------+
|  location  | Location_Description | FacilityID | Active |
+------------+----------------------+------------+--------+
| Location   | TEST                 | TEST       | Y      |
+------------+----------------------+------------+--------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...