Вы можете попробовать это так:
DECLARE @mockupTable TABLE(ID INT IDENTITY, YourXml XML);
INSERT INTO @mockupTable VALUES
(N'<orders xmlns="www address">
<order order-no="000001">
<order-date>2019-09-05</order-date>
<created-by>storefront</created-by>
<original-order-no>000001</original-order-no>
<currency>USD</currency>
<taxation>gross</taxation>
<invoice-no>0099999</invoice-no>
<customer>
<customer-name>Jonh Smith</customer-name>
<customer-email>JonhSmith@gmail.com</customer-email>
</customer>
</order>
</orders>');
WITH XMLNAMESPACES(DEFAULT N'www address')
SELECT o.value(N'@order-no',N'varchar(10)') AS OrderNo
,o.value(N'(order-date/text())[1]',N'date') AS OrderDate
,o.value(N'(created-by/text())[1]',N'varchar(100)') AS CreatedBy
,o.value(N'(original-order-no/text())[1]',N'varchar(10)') AS OriginalOrderNo
,o.value(N'(currency/text())[1]',N'varchar(10)') AS Currency
,o.value(N'(taxation/text())[1]',N'varchar(10)') AS Taxation
,o.value(N'(invoice-no/text())[1]',N'varchar(10)') AS InvoiceNo
,o.value(N'(customer/customer-name/text())[1]',N'varchar(100)') AS CustomerName
,o.value(N'(customer/customer-email/text())[1]',N'varchar(100)') AS CustomerEMail
FROM @mockupTable t
CROSS APPLY t.YourXml.nodes(N'/orders/order') A(o);
Помните о необходимости правильно объявлять пространство имен (по умолчанию). Я использовал .nodes()
, потому что «заказы» звучат как множественное число. Ваш образец включает только один заказ, но может быть больше ...
ОБНОВЛЕНИЕ: Ваши дополнительные "примечания"
В любом случае отношения 1:n
(многие узлы связаны с одним узлом-участником), вам нужно .nodes()
, чтобы получить каждый фрагмент в виде отдельной строки:
WITH XMLNAMESPACES(DEFAULT N'www address')
SELECT o.value(N'@order-no',N'varchar(10)') AS OrderNo
,o.value(N'(order-date/text())[1]',N'date') AS OrderDate
,o.value(N'(created-by/text())[1]',N'varchar(100)') AS CreatedBy
,o.value(N'(original-order-no/text())[1]',N'varchar(10)') AS OriginalOrderNo
,o.value(N'(currency/text())[1]',N'varchar(10)') AS Currency
,o.value(N'(taxation/text())[1]',N'varchar(10)') AS Taxation
,o.value(N'(invoice-no/text())[1]',N'varchar(10)') AS InvoiceNo
,o.value(N'(customer/customer-name/text())[1]',N'varchar(100)') AS CustomerName
,o.value(N'(customer/customer-email/text())[1]',N'varchar(100)') AS CustomerEMail
,n.value(N'(created-by/text())[1]',N'nvarchar(100)') AS Note_CreatedBy
,n.value(N'(creation-date/text())[1]',N'datetime') AS Note_CreatedBy
,n.value(N'(subject/text())[1]',N'nvarchar(100)') AS Note_CreatedBy
,n.value(N'(text/text())[1]',N'nvarchar(1000)') AS Note_CreatedBy
FROM @mockupTable t
CROSS APPLY t.YourXml.nodes(N'/orders/order') A(o)
OUTER APPLY A.o.nodes(N'notes/note') B(n);
Последняя строка выберет текущий ордер и передаст его в .nodes()
. Это вернет производный набор с одной строкой на <note>
.