Domanda SQL FOR XML: emissione di dati come elementi o attributi


Sto cercando di esportare alcuni dati da un database in un particolare formato XML specificato dal cliente. L'XML che produco sarà manipolato (presumibilmente da XSLT) da una terza parte per produrre l'output finale, ma voglio formulare il mio XML il più vicino possibile a quel formato.

Il cliente ha richiesto dati su ciascun prodotto in questo modo:

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

Il mio SQL esistente è:

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

... che rende:

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

Mi aspetto che sia abbastanza facile manipolare questi dati in XSLT, ma puramente come esercizio intellettuale, mi piacerebbe vedere quanto lontano potrei fare in SQL. La mia prima ambizione era semplicemente esprimere l'id come attributo del prodotto piuttosto che come elemento figlio. Il rendering dell'elemento activeState che stavo per lasciare all'XSLT, ma chiaramente, se posso aiutarli nel loro cammino, perché non farlo ...

Eventuali suggerimenti?


18
2018-03-29 14:33


origine


risposte:


Uso @ per creare attributi.

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')

28
2018-03-29 15:27