Проблема XML-пути в SQL Server - PullRequest
0 голосов
/ 22 февраля 2019

Я использую SQL Server для загрузки данных в формате XML.Я использую довольно мало таблиц в реальной реализации для загрузки данных.

Поскольку проще воспроизвести добавление фиктивного файла во временные таблицы, как показано ниже

create table #T1(Id int, ItemName varchar(25))
create table #T2(ItemId int, ImagePath varchar(25))

Insert Into #T1
values (1, 'Item1'), (2, 'Item2')

Insert Into #T2
values (1, 'Path 1'), (1, 'Path 2'), (1, 'Path 3'),
       (2, 'Path 4'), (2, 'Path 5')

Я пишу запрос, как показано ниже (этоупрощенная версия для воспроизведения)

SELECT 
    'Some title' Title,
    (SELECT
         (SELECT * 
          FROM
              (SELECT 
                   *,
                   (SELECT TOP 2 ImagePath AS 'href'
                    FROM #T2 AS Image
                    WHERE Image.ItemId = ItinRow.Id
                    FOR XML PATH('Image'), ELEMENTS, TYPE) Images
                FROM 
                    #T1 ItinRow) AS ItinItemRow
          FOR XML PATH('Collections'), TYPE, ELEMENTS)
    FOR XML PATH(''), TYPE, ELEMENTS)                   
FROM 
    (SELECT *
     FROM #T1) ItinGroupPage
FOR XML PATH('Group'), ELEMENTS

, которая создает эту структуру XML

 <Group>
  <Title>Some title</Title>
  <Collections>
    <Id>1</Id>
    <ItemName>Item1</ItemName>
    <Images>
      <Image>
        <href>Path 1</href>
      </Image>
      <Image>
        <href>Path 2</href>
      </Image>
    </Images>
  </Collections>
  <Collections>
    <Id>2</Id>
    <ItemName>Item2</ItemName>
    <Images>
      <Image>
        <href>Path 4</href>
      </Image>
      <Image>
        <href>Path 5</href>
      </Image>
    </Images>
  </Collections>
</Group>

Моя проблема связана с этим узлом изображений.Я действительно хочу вывести что-то, как показано ниже, без узла Images

 <Group>
  <Title>Some title</Title>
  <Collections>
    <Id>1</Id>
    <ItemName>Item1</ItemName>    
      <Image>
        <href>Path 1</href>
      </Image>
      <Image>
        <href>Path 2</href>
      </Image>
  </Collections>
  <Collections>
    <Id>2</Id>
    <ItemName>Item2</ItemName>
      <Image>
        <href>Path 4</href>
      </Image>
      <Image>
        <href>Path 5</href>
      </Image>
  </Collections>
</Group>

Но когда я пытаюсь удалить это из запроса, я получаю эту ошибку:

Имя столбца не былоуказано для столбца 3 «Предметов»

Есть ли способ достичь ожидаемой структуры XML?

1 Ответ

0 голосов
/ 22 февраля 2019

Я считаю, что этот SQL должен возвращать то, что вы ищете:

SELECT
    'Some title' AS 'Title',
    (SELECT 
         Id,
         ItemName,
         (SELECT ImagePath AS 'Image/href'
          FROM #T2
          WHERE #T2.ItemId = #T1.Id
          FOR XML PATH(''), TYPE)
      FROM 
          #T1
      FOR XML PATH('Collections'), TYPE)
FOR XML PATH(''), ROOT('Groups')

В моем SQL Server 2016 я получаю этот XML из предоставленных вами примеров данных:

<Groups>
  <Title>Some title</Title>
  <Collections>
    <Id>1</Id>
    <ItemName>Item1</ItemName>
    <Image>
      <href>Path 1</href>
    </Image>
    <Image>
      <href>Path 2</href>
    </Image>
    <Image>
      <href>Path 3</href>
    </Image>
  </Collections>
  <Collections>
    <Id>2</Id>
    <ItemName>Item2</ItemName>
    <Image>
      <href>Path 4</href>
    </Image>
    <Image>
      <href>Path 5</href>
    </Image>
  </Collections>
</Groups>
...