2010-09-28 2 views
1

У меня есть сплющенная таблица, содержащая столбцы, представляющие группы, которые должны отображаться в XML. Пример данные:Преобразование табличных данных в XML с использованием SQL Server

Market, Label, Style, Type 
XXX, YYY, JJJ, 111 
XXX, YYY, JJJ, 222 
XXX, YYY, JJJ, 333 
XXX, YYY, JJJ, 444  
XXX, YYY, LLL, 111  
XXX, YYY, LLL, 222  
XXX, YYY, LLL, 333  
XXX, YYY, LLL, 444 

Использование T-SQL, что будет лучшим способом вывести следующее:

<Market value=XXX> 
    <label value=YYY> 
     <Style value=JJJ> 
      <Type value=111> 
      </Type> 
      ... 
     </Style> 
     <Style value=LLL> 
      ... 
     </Style> 
    </label> 
</Market> 

Могу ли я сделать это, используя XML Явный пункт в SQL Server?

ответ

1

Форматирование сложных XML документов в T-SQL является поручением дурака. Это можно сделать - может быть, но потом вы вернетесь к нему через месяц, а то, что у вас есть, непостижимо.

Это намного проще, чем написать метод на C# или что-то другое, что обрабатывает DataReader для создания XML или записи преобразования XSLT, преобразующего XML, испускаемый из запроса, в любой специализированный формат, который вы пытаетесь создать ,

+0

Единственная причина, по которой это проще сделать в C#/etc - это практика и знакомство. Генерация XML через [T] SQL не будет легче, если вы никогда не будете работать с ней. –

0

есть 3 способа формирования для создания таблицы в XML в SQL Server 2000:

  1. для XML авто -> генерировать запрос XML автоматически на основе использования таблицы
  2. для XML-сырца -> генерировать таблица запроса к строке тега в XML
  3. для XML EXPLICIT -> самых сложный, но наиболее комфортным способом :) вы можете определить собственную структуру XML

для шпаргалки вы можете увидеть этот link

надеюсь, что это может вам помочь.

+1

Есть четыре, 'PATH' 2005+ –

+0

Спасибо за ссылку. Я посмотрел на 3 варианта. Все они, кажется, предлагают примеры, которые используют несколько таблиц. Моя проблема использует только одну таблицу для создания иерархии XML. Не уверен, что это можно сделать в SQL? – Panaymel

+0

Я уверен, что он сработает. потому что tuts для sql-сервера :) – fritz

2

Это может помочь .. посмотри

SELECT distinct MyTable.Market "Market/@Value", 
     MyTable.Label "Market/Label/@Value", 
     MyTable.Style "Market/Label/Style/@Value", 

      (SELECT Type AS "Value" 
       FROM MyTable myTab 
       WHERE myTab.Market=MyTable.Market 
         and myTab.Label=MyTable.Label 
         and myTab.Style = MyTable.Style 
       FOR XML PATH ('') 
       ) AS "Market/Label/Style/Type" 
     FROM MyTable 
FOR XML PATH('') 

Результирующей XML была:

<Market Value="XXX"> 
    <Label Value="YYY"> 
    <Style Value="JJJ"> 
     <Type>&lt;Value&gt;111&lt;/Value&gt;&lt;Value&gt;222&lt;/Value&gt;&lt;Value&gt;333&lt;/Value&gt;&lt;Value&gt;444&lt;/Value&gt;</Type> 
    </Style> 
    </Label> 
</Market> 
<Market Value="XXX"> 
    <Label Value="YYY"> 
    <Style Value="LLL"> 
     <Type>&lt;Value&gt;111&lt;/Value&gt;&lt;Value&gt;123&lt;/Value&gt;</Type> 
    </Style> 
    </Label> 
</Market> 

Надеется, что это помогает

+0

Спасибо за это. Его так близко, но когда я добавляю больше данных, он не правильно группируется. Я думаю, что я отвечу Роберту, что было бы проще сделать это в коде. – Panaymel

0

Посмотрите на библиотеку SQLXML. Вы можете создать аннотированный XSD-файл, который будет создавать XML-документ.

http://msdn.microsoft.com/en-us/library/ms172699

Просто быть предупрежден о том, что эффективность этого метода очень плохо. Я сделал несколько запросов в Microsoft, чтобы посмотреть на эту проблему. Я сравнил ручную запись запроса «FOR XML», который завершает миллисекунды, а аннотированная версия XSD занимает 10 секунд.

Я лично считаю, что аннотированные XSD - очень изящное решение, если вы можете обойти плохую работу.

Смежные вопросы