Результат таблицы SQL в выводе xml

у меня есть стол

Key     code 
1       100
1       200
1       300
1       400
2       100
2       200
2       300

Я ищу свой результат в одной строке с ключом и другой строкой XML_data

Key      XML_Data(XML column)
1        <sub><key>1...
2        <sub><key>2...

Пример XML_Data:

<sub>
  <key> 1 </Key>
    <list>
      <code> 100 </code>
      <code> 200 </code>
      <code> 300 </code>
      <code> 400 </code>
   </list>
</sub>

Спасибо


person AB04    schedule 23.03.2017    source источник
comment
Запрос, который вы пробовали до сих пор?   -  person Pred    schedule 23.03.2017


Ответы (3)


Ваш вопрос довольно нечеткий, но мой волшебный хрустальный шар подсказывает мне, что вы ищете это:

DECLARE @tbl TABLE([Key] INT, code INT);
INSERT INTO @tbl VALUES 
 (1,100)
,(1,200)
,(1,300)
,(1,400)
,(2,100)
,(2,200)
,(2,300);

--Запрос сначала найдет отдельный список ключей, а затем использует вложенные FOR XML-выборки, чтобы собрать ваши данные в желаемую структуру:

WITH DistinctKeys AS
(SELECT [Key] FROM @tbl GROUP BY [Key])
SELECT dk.[Key]
      ,(
        SELECT dk.[Key]
              ,(
                SELECT t.code
                FROM @tbl AS t
                WHERE t.[Key]=dk.[Key]
                FOR XML PATH(''),ROOT('list'),TYPE
               )
        FOR XML PATH('sub'),TYPE    
       ) AS XML_Data
FROm DistinctKeys AS dk

Результат

Key XML_Data
1   <sub><Key>1</Key><list><code>100</code><code>200</code><code>300</code><code>400</code></list></sub>
2   <sub><Key>2</Key><list><code>100</code><code>200</code><code>300</code></list></sub>
person Shnugo    schedule 24.03.2017

Я думаю, что это SQL Server: двухуровневая GROUP BY с XML вывод ближе.

Опубликовано здесь, потому что у меня нет репутации для комментариев.

person Nanyin    schedule 23.03.2017

Вы не указали много, где находится ваш XML и т. д., но в целом следующий запрос должен помочь в вашем случае.

INSERT INTO dbo.YourTable
  (key, xml_data) 
VALUES 
  (KEY, CONVERT(XML, N'YOUR_XML', 2));

Вы можете пойти еще дальше, объявив XML как переменную, извлекая свой KEY из XML и добавляя во второй столбец XML на основе всей переменной.

DECLARE @input XML = '<sub>
  <key> 1 </key>
    <list>
      <code> 100 </code>
      <code> 200 </code>
      <code> 300 </code>
      <code> 400 </code>
   </list>
</sub>'

INSERT INTO dbo.YourTable(key, xml_data)
   SELECT
      key = COALESCE(XCol.value('key[1]', 'int'),0),
      xml_data = CONVERT(XML, N''''+@input+'''', 2)
   FROM  @input.nodes('/sub') AS XTbl(XCol)

@ATC, спасибо за ваш комментарий. Если действительно необходимо преобразовать таблицу в формат XML, попробуйте следующее: FOR XML PATH — это то, что вы ищете.

SELECT 
   key,
   code as "list/code"
FROM dbo.YourTable
FOR XML PATH('sub')

Я не могу проверить это прямо сейчас, к сожалению. Здесь вы можете увидеть аналогичный вопрос: Как преобразовать записи в таблице в формат xml с помощью T-SQL?

person morb1d    schedule 23.03.2017
comment
Ваш обновленный запрос не приведет к структуре, которую OP указывает в своем вопросе... - person Shnugo; 24.03.2017
comment
@Shnugo спасибо за комментарий, к сожалению, я не могу провести настоящее тестирование из-за ограничений моего ПК / среды. Это было больше похоже на концепцию дальнейшего развития. Видел ваш ответ, похоже, он хорошо решит проблему, спасибо! - person morb1d; 24.03.2017