MS SQL 2005 Таблица в XML - PullRequest
       27

MS SQL 2005 Таблица в XML

3 голосов
/ 31 октября 2008

У меня есть простая таблица в SQL Server 2005, я хочу преобразовать ее в XML (используя предложение FOR FOR). У меня проблемы с тем, чтобы мой XML выглядел как требуемый вывод.

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

Таблица у меня выглядит вот так

TYPE,GROUP,VALUE
Books,Hardback,56
Books,Softcover,34
CDs,Singles,45
CDS,Multis,78

Мне нужен стиль вывода:

<data>
  <variable name="TYPE">
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
  </variable>
 <variable name="TYPE">
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
   <row>
     <column>GROUP</column>
     <column>VALUE</column>
   </row>
  </variable>
</data>

Edit: Насколько я могу судить, мне нужно несколько значений. Я создаю XML для использования с Xcelsius ( Связывание XML и Xcelsius ), поэтому не имею никакого контроля над форматированием XML. Я могу сгенерировать XML с использованием ASP согласно связанному учебнику, но я надеялся получить его прямо из SQL Server.

Редактировать 2: Я надеялся на что-нибудь элегантное и аккуратное ... но пример Годеке оказался ближе всего. Немного возиться с SQL, и я придумал:

select
   "type" as '@name', 
   "group" as 'row/column',
   null as 'row/tmp', 
   "value" as 'row/column'
from tableName
for xml path('variable'), root('data')

Выводится почти так, как я хотел. Строка null / tmp даже не выводится; это просто предотвращает объединение. Тем не менее тег <variable name="TYPE"> повторяется для каждого ряда, которого у меня не может быть.

Ответы [ 3 ]

2 голосов
/ 31 октября 2008

Насколько я могу получить это:

select "type" as '@name', "group" as 'row/column1', "value" as 'row/column2'
from tableName
for xml path('variable'), root('data')

Именование двух одинаковых элементов («столбец» и «столбец») - это не то, что я знаю, как сделать за один проход, но с другой стороны, это странный выбор схемы XML; обычно элементы имеют уникальные имена, если они содержат разные данные. Очевидный выбор (назовите их оба «строка / столбец») просто объединяет их в выводе в одно значение.

Также обратите внимание, что каждая возвращаемая строка будет «переменным» элементом, отличным от других. Чтобы получить вложение без лишних записей, потребуется подзапрос:

select distinct "type" as '@name'
from Agent
for xml path('variable'), root('data')

была моей первой мыслью, но различие мешает гнездованию.

Все это заставляет меня думать, что для получения точного выхода вам может потребоваться использовать режим EXPLICIT. Возможно, у меня проблема с чем-то вроде этого, я ставлю и использую DOMDocument в коде:).

1 голос
/ 31 октября 2008

Я предпочитаю использовать для XML PATH, он предоставляет более удобный способ управления вашими элементами и т. Д.

См

Но это довольно сложно

 /*
create table #tablename
(
[type] varchar(20),
[group] varchar(20),
[value] varchar(20)
)

insert into #tablename select 'type1','group11','value111'
insert into #tablename select 'type1','group11','value112'
insert into #tablename select 'type1','group12','value121'
insert into #tablename select 'type1','group12','value122'
insert into #tablename select 'type2','group21','value211'
insert into #tablename select 'type2','group21','value212'
insert into #tablename select 'type2','group22','value221'
insert into #tablename select 'type2','group22','value222'

alter table #tablename add id uniqueidentifier

update #tablename set id = newid()
*/

select [type] as '@name',
    (select     
        (select [column] from
            (
                select [group] as 'column', tbn1.type, tbn2.[group]
               from #tablename tbn3 WHERE tbn3.type = tbn1.type and tbn2.[group] =  tbn3.[group]
               union
         select [value], tbn1.type, tbn2.[group]
              from #tablename tbn3 WHERE tbn3.type = tbn1.type and tbn2.[group] = tbn3.[group]
            ) as s
        for xml path(''),type 
        )
    from #tablename tbn2 
    where tbn2.type = tbn1.type
    for xml path('row3'), type
)

from #tableName tbn1 
GROUP BY [type]
for xml path('variable'), root('data') 

дает вам то, о чем вы просите меня, но элегантно и аккуратно это не так.

0 голосов
/ 31 октября 2008

Сценарий ниже производит желаемый формат



<ПЕРЕМЕННЫЙ ТИП = "Книги">

Твердый переплет
56


Мягкая обложка
34




Одиночные игры
45


Multis
78


Invoke

<br/>DECLARE @tblItems table ( <br/> [TYPE] varchar(50) <br/> ,[GROUP] varchar(50) <br/> ,[VALUE] int <br/>) <br/> <br/>DECLARE @tblShredded table ( <br/> [TYPE] varchar(50) <br/> ,[XmlItem] xml <br/>) <br/> <br/>DECLARE @xmlGroupValueTuples xml <br/> <br/>insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'Books','Hardback',56) <br/>insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'Books','Softcover',34) <br/>insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'CDs','Singles',45) <br/>insert into @tblItems([TYPE],[GROUP],[VALUE]) values( 'CDS','Multis',78) <br/> <br/>SET @xmlGroupValueTuples = <br/> ( <br/> SELECT <br/> "@TYPE" = [TYPE] <br/> ,[GROUP] <br/> ,[VALUE] <br/> FROM @tblItems <br/> FOR XML PATH('row'), root('Root') <br/> ) <br/> <br/>INSERT @tblShredded([TYPE], XmlItem) <br/>SELECT <br/> [TYPE] = XmlItem.value('./row[1]/@TYPE', 'varchar(50)') <br/> ,XmlItem <br/>FROM dbo.tvfShredGetOneColumnedTableOfXmlItems(@xmlGroupValueTuples) <br/> <br/> <br/>SELECT <br/> ( <br/> SELECT <br/> VARIABLE = <br/> ( <br/> SELECT <br/> "@TYPE" = t.[TYPE] <br/> <br/> ,( <br/> SELECT <br/> tInner.XmlItem.query('./child::*') <br/> FROM @tblShredded tInner <br/> WHERE tInner.[TYPE] = t.[TYPE] <br/> FOR XML PATH(''), ELEMENTS, type <br/> ) <br/> FOR XML PATH('VARIABLE'),type <br/> ) <br/> ) <br/>FROM @tblShredded t <br/>GROUP BY <br/> t.[TYPE] <br/>FOR XML PATH(''), ROOT('DATA')

, где

<br/>-- Example Inputs <br/>/* <br/>DECLARE @xmlListFormat xml <br/>SET @xmlListFormat = <br/> ' <br/> <XmlListRoot> <br/> <Item>004421UB7</Item> <br/> <Item>59020UH24</Item> <br/> <Item>542514NA8</Item> <br/> </XmlListRoot> <br/> ' <br/>*/ <br/> <br/>-- ============================================= <br/>-- Author: 6eorge Jetson <br/>-- Create date: 01/22/3003 <br/>-- Description: Shreds an input XML list conforming to the expected list schema <br/>-- ============================================= <br/>CREATE FUNCTION [dbo].[tvfShredGetOneColumnedTableOfXmlItems] (@xmlListFormat xml) <br/>RETURNS <br/>@tblResults TABLE (XmlItem xml) <br/>AS <br/>BEGIN <br/> <br/> INSERT @tblResults <br/> SELECT <br/> tblShredded.colXmlItem.query('.') as XmlItem <br/> FROM <br/> @xmlListFormat.nodes('/child::*/child::*') as tblShredded(colXmlItem) <br/> <br/> RETURN <br/>END
...