Получить данные из SQL как XML - PullRequest
0 голосов
/ 04 августа 2020

Я был бы очень признателен за помощь. Я использую SQL FOR XML PATH, но у меня есть проблемы с узлами.

У меня простая таблица (ниже приведен сценарий для генерации)

voucher_number  payment_number  payment_date
---------------------------------------------------
D15             C15             2020-07-27
D16             C16             2020-07-25

Я бы хотел, чтобы XML выглядел так, посмотрите на уровень «объекта»:

<?xml version="1.0" encoding="UTF-8"?>
<objects>
   <object>
      <record>
         <voucher_number>D15</voucher_number>
         <payment_number>C15</payment_number>
         <payment_date>2020-07-27</payment_date>
      </record>
      <record>
         <voucher_number>D16</voucher_number>
         <payment_number>C16</payment_number>
         <payment_date>2020-07-25</payment_date>
      </record>
   </object>
</objects>

Но когда я запускаю этот скрипт

SELECT 
      [voucher_number] as   [record/voucher_number]
      ,[payment_number] as  [record/payment_number]
      ,[payment_date] as    [record/payment_date]
  FROM #t1
FOR XML PATH ('object'), ROOT('Objects')

, он выглядит так. ... посмотрите на уровень "объекта".

   <?xml version="1.0" encoding="UTF-8"?>
    <Objects>
      <object>
          <record>
             <voucher_number>D15</voucher_number>
             <payment_number>C15</payment_number>
             <payment_date>2020-07-27</payment_date>
          </record>
       </object>
      <object>
          <record>
             <voucher_number>D16</voucher_number>
             <payment_number>C16</payment_number>
             <payment_date>2020-07-25</payment_date>
          </record>
       </object>
    </Objects>

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

Большое, большое спасибо заранее :)

--- Script to generate the test table ---
Create table #t1 
    (
    [voucher_number] [nvarchar](50) NULL,
    [payment_number] [nvarchar](50) NULL,
    [payment_date] [date] NULL
    )

INSERT #t1 ([voucher_number], [payment_number], [payment_date]) VALUES (N'D15', N'C15',  CAST(N'2020-07-27' AS Date))
GO
INSERT #t1 ([voucher_number], [payment_number], [payment_date]) VALUES (N'D16', N'C16', CAST(N'2020-07-25' AS Date))

1 Ответ

0 голосов
/ 04 августа 2020

Один метод, использующий несколько вложенных FOR XML запросов:

SELECT (SELECT V.voucher,
               V.payment,
               V.date
        FROM (VALUES('D15','C15',CONVERT(date,'20200727')),
                    ('D16','C16',CONVERT(date,'20200725')))V(voucher, payment, date)
        FOR XML PATH('record'), ROOT('object'),TYPE)
FOR XML PATH('objects');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...