SQL Server эквивалентно форматированию xmlelement - PullRequest
0 голосов
/ 11 июня 2018

Я написал пакет Oracle для запроса некоторых данных в XML, как показано ниже:

select 
  XMLSERIALIZE(DOCUMENT 
  xmlelement("QueryResults", XMLAttributes('Demographics And Relationships' as "title"),
  xmlelement("Row",
    xmlelement("field",XMLAttributes( 'Title' as "title"),pn.title),
    xmlelement("field",XMLAttributes( 'First Names' as "title"),pn.first_names),
    xmlelement("field",XMLAttributes( 'Last Name' as "title"), pn.last_name)
  )
  ) as clob indent size = 2
) as XML
from people_names pn

, который возвращает:

<QueryResults title="Demographics And Relationships">
<Row>
<field title="Title">MR</field>
<field title="First Names">John</field>
<field title="Last Name">Smith</field>
<field title="Date of Birth">20/07/1990</field>
</Row>
</QueryResults>

, который я сейчас пытаюсь собратьверсия SQL-сервера того же пакета, но не может заставить его соответствовать выводу Oracle, который включает элемент ROW, чтобы покрыть каждую возвращаемую строку, тег поля, чтобы покрыть каждый элемент в строке, и псевдоним для имени столбца, который будет использоватьсяв качестве атрибута.

Я пробовал различные перестановки FOR XML EXPLICIT / RAW / AUTO и т. д. и может получить некоторые выходные данные, но не все.Может кто-нибудь предложить способ, как я могу сделать это с T-SQL?большое спасибо.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Как уже сказал вам Йерун Мостерт: Есть больше подходов к скину, чем кошка: -)

Это мое предложение.

SELECT 'Demographics And Relationships' AS [@title]
      ,(
        SELECT 'Title' AS [field/@title]
              ,pn.title AS [field]
              ,''
              ,'First Names' AS [field/@title]
              ,pn.first_names AS [field]
              ,''
              ,'Last Name' AS [field/@title]
              ,pn.last_name AS [field]
              ,''
              ,'Date of Birth' AS [field/@title]
              ,pn.date_of_birth AS [field]
        FROM @t pn
        FOR XML PATH('Row'),TYPE
       )
FOR XML PATH('QueryResults');

Вам нужен внешний суб-выбор, потому чтоесть атрибут в верхний корневой уровень .Вы можете использовать ROOT('root') для создания корневого элемента, но никакие атрибуты здесь не поддерживаются.Вот почему нам нужен внешний FOR XML PATH().

Внутренний список <field> узлов может быть получен с помощью хитрости: просто поместите пустой «столбец» между ними.Это скажет движку закрыть элемент и запустить новый.

О вашей DOB: в XML любая дата должна быть ISO8601.В разных системах дату, например 03/12/1991, можно считать третьим декабря или двенадцатым марта.Пусть двигатель сделает перевод за вас ...

0 голосов
/ 11 июня 2018

В T-SQL существует более одного способа создания обложки для этого кота, но я бы предпочел FOR XML PATH:

DECLARE @T TABLE(
    title nvarchar(max),
    first_names nvarchar(max),
    last_name nvarchar(max),
    date_of_birth datetime
)
INSERT @t VALUES 
    ('MR', 'John', 'Smith', '1990-07-20'), 
    ('MS', 'Jane', 'Doe', '1991-12-03')

SELECT [@title] = 'Demographics and Relationships', (
    SELECT
        (SELECT [@title] = 'Title', [data()] = title FOR XML PATH('field'), TYPE),
        (SELECT [@title] = 'First Names', [data()] = first_names FOR XML PATH('field'), TYPE),
        (SELECT [@title] = 'Last Name', [data()] = last_name FOR XML PATH('field'), TYPE),
        (SELECT [@title] = 'Date of Birth', [data()] = FORMAT(date_of_birth, 'dd/MM/yyyy') FOR XML PATH('field'), TYPE)
    FROM @T
    FOR XML PATH('Row'), TYPE
)
FOR XML PATH('QueryResults')

Результат:

<QueryResults title="Demographics and Relationships">
  <Row>
    <field title="Title">MR</field>
    <field title="First Names">John</field>
    <field title="Last Name">Smith</field>
    <field title="Date of Birth">20/07/1990</field>
  </Row>
  <Row>
    <field title="Title">MS</field>
    <field title="First Names">Jane</field>
    <field title="Last Name">Doe</field>
    <field title="Date of Birth">03/12/1991</field>
  </Row>
</QueryResults>
...