XML в SQL - SQL Server - PullRequest
       3

XML в SQL - SQL Server

0 голосов
/ 02 июля 2018

Я перебираю XML-файл для чтения узлов и заполнения таблиц SQL Server. У меня есть узел Root, имеющий узел Department, который в дальнейшем может содержать один или несколько элементов. Я хочу выбрать все возможные значения в наборе результатов SQL.

Пожалуйста, найдите ниже XML, я имею в виду:

DECLARE @x XML='
<Root>
<Department>
<DeptID>D101</DeptID>
<DeptID>D102</DeptID>
</Department>
</Root>'

Я использую SQL-запрос ниже, чтобы получить данные из XML, но я могу читать только первый DeptID, так как я передаю [1] внутри DeptID [1]. Если я пройду [2], я смогу получить второе значение. Но в реальной жизни я не смогу узнать, сколько DeptID будет в XML. Поэтому я хочу, чтобы общий сценарий считывал столько, сколько DeptID входит в XML.

SELECT  n.value('DeptID[1]','varchar(10)') AS DeptID FROM @x.nodes('/Root/Department') R(n)

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вы можете использовать метод OpenXMl сервера sql, чтобы получить больше элементов в таблице следующим образом.

Шаг 1: Предположим, это ваш пример XML-данных.

DECLARE @XML XML='
<ROOT>
<Customers>
<Customer CustomerID="C001" CustomerName="Arshad Ali">
<Orders>
<Order OrderID="10248" OrderDate="2012-07-04T00:00:00">
<OrderDetail ProductID="10" Quantity="5" />
<OrderDetail ProductID="11" Quantity="12" />
<OrderDetail ProductID="42" Quantity="10" />
</Order>
</Orders>
<Address> Address line 1, 2, 3</Address>
</Customer>
<Customer CustomerID="C002" CustomerName="Paul Henriot">
<Orders>
<Order OrderID="10245" OrderDate="2011-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12" />
<OrderDetail ProductID="42" Quantity="10" />
</Order>
</Orders>
<Address> Address line 5, 6, 7</Address>
</Customer>
<Customer CustomerID="C003" CustomerName="Carlos Gonzlez">
<Orders>
<Order OrderID="10283" OrderDate="2012-08-16T00:00:00">
<OrderDetail ProductID="72" Quantity="3" />
</Order>
</Orders>
<Address> Address line 1, 4, 5</Address>
</Customer>
</Customers>
</ROOT>'

Шаг 2: Использование метода OPENXML для получения элементов на любом уровне следующим образом.

DECLARE @hDoc AS INT, @SQL NVARCHAR (MAX)

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT CustomerID, CustomerName, Address, OrderID, OrderDate, ProductID, Quantity
FROM OPENXML(@hDoc, 'ROOT/Customers/Customer/Orders/Order/OrderDetail')
WITH 
(
CustomerID [varchar](50) '../../../@CustomerID',
CustomerName [varchar](100) '../../../@CustomerName',
Address [varchar](100) '../../../Address',
OrderID [varchar](1000) '../@OrderID',
OrderDate datetime '../@OrderDate',
ProductID [varchar](50) '@ProductID',
Quantity int '@Quantity'
)

EXEC sp_xml_removedocument @hDoc
GO

Вышеуказанные шаги приведут вас к следующему выводу.

xml_data_to_table

0 голосов
/ 02 июля 2018

Попробуй вот так

DECLARE @x XML='
<Root>
<Department>
<DeptID>D101</DeptID>
<DeptID>D102</DeptID>
</Department>
</Root>';

SELECT d.value('text()[1]','varchar(10)') AS DeptID
FROM @x.nodes('/Root/Department/DeptID') A(d);

Ваш собственный код

SELECT  n.value('DeptID[1]','varchar(10)') AS DeptID 
FROM @x.nodes('/Root/Department') R(n)

... следует правильной идее. Но .nodes() должен возвращать повторяющийся элемент, то есть <DeptID>. Ваш подход ищет первые <DeptID> в пределах <Department> на самом деле

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