2012-03-29 23 views
17

Próbuję wyeksportować niektóre dane z bazy danych w określonym formacie XML określonym przez klienta. Produkowany przeze mnie plik XML zostanie zmanipulowany (prawdopodobnie przez XSLT) przez trzecią stronę w celu uzyskania ostatecznego wyniku, ale chcę sformatować mój XML tak blisko, jak to tylko możliwe, do tego formatu.SQL FOR XML - Dane wyjściowe jako elementy lub jako Atrybuty

Klient zażądał danych na temat każdego produktu tak:

<product id="1234567890123"> 
    <activeState partNumber="A1234567890" shipmentDate="20110518" /> 
</product> 

Moja istniejący SQL to:

SELECT SerialNo as id, 
    PartNo as partNumber, 
    CONVERT(VARCHAR(8), GETDATE(), 112) AS shipmentDate, 
FROM Products 
WHERE SerialNo = @SerialNo 
FOR XML PATH ('product'), TYPE) 

... co czyni:

<product> 
    <id>100000000458</id> 
    <partNumber>10004905892</partNumber> 
    <shipmentDate>20120312</shipmentDate> 
</product> 

Spodziewam się, że łatwo jest manipulować tymi danymi w XSLT, ale wyłącznie jako ćwiczenie intelektualne, chciałbym zobaczyć, jak daleko mogę SQL. Moją pierwszą ambicją było po prostu wyrazić id jako atrybut produktu, a nie jako element dziecka. Renderowanie elementu activeState miałem zamiar pozostawić XSLT, ale wyraźnie, jeśli mogę pomóc im w drodze, dlaczego nie zrobić tak ...

Wszelkie sugestie?

Odpowiedz

27

Użyj atrybutów @, aby utworzyć atrybuty.

select SerialNo as "@id", 
     PartNo as "activeState/@partNumber", 
     convert(varchar(8), getdate(), 112) as "activeState/@shipmentDate" 
from Products 
where SerialNo = @SerialNo 
for xml path('product') 
+0

działa wspaniale - dzięki. – CJM

Powiązane problemy