将多个子元素从XML插入SQL Server数据库

时间:2013-12-01 09:55:06

标签: sql sql-server xml

声明了以下XML:

DECLARE @XML XML = '<reservering reserveringsnummer="1" status="aanvraag">
<park>Nationaal park Oosterschelde</park>
<accomodatie>Appartement</accomodatie>
<aantalBezoekers>2</aantalBezoekers>
<startdatum>2013-12-12</startdatum>
<einddatum>2013-12-20</einddatum>
<voorkeur>Rustige plaats</voorkeur>
<opties>
    <optie>arrangement</optie>
    <optie>bedlinnenset</optie>
</opties>
<klant>
    <aanhef>De heer</aanhef>
    <naam>Naam</naam>
    <adres>Adres</adres>
    <postcode>Postcode</postcode>
    <email>Mail</email>
    <rekeningnummer>nummer</rekeningnummer>
</klant>
</reservering>'

我想将选项(arrange和bedlinnenset)插入到我的数据库表中。现在我有以下代码来实现这个目标:

  INSERT INTO  [RESERVERING_PRODUCT](
  [reserveringnummer], [product])

  SELECT
ReserveringNummer = Reservering.value('@reserveringsnummer', 'int'),
    Opties = Opties.value('(optie)[1]', 'varchar(50)')
  FROM
   @XML.nodes('/reservering') AS ReserveringTable(Reservering),
   @XML.nodes('/reservering/opties') AS OptiesTable(Opties)

使用此代码,我只能通过执行(optie)[1](optie)[2]等来选择必须在我的表中插入哪个选项。但是,如何插入XML中的每个选项?

1 个答案:

答案 0 :(得分:2)

您非常接近 - 您只需添加CROSS APPLY即可获得<optie>节点下所有<reservering>个子节点的列表

SELECT
    ReserveringNummer = XReservering.value('@reserveringsnummer', 'int'),
    Opties = XOpties.value('(.)', 'varchar(50)')
FROM
    @XML.nodes('/reservering') AS XTbl1(XReservering)
CROSS APPLY
    XReservering.nodes('opties/optie') AS XTbl2(XOpties)

执行此操作后,您将评估所有<optie>个节点,现在您可以轻松地将这些数据插入到表格中