在SQL数据库中插入XML数据

时间:2013-11-29 20:57:45

标签: sql xml insert sql-server-2008-r2

如何将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>
</opties>
<klant>
    <aanhef>De heer</aanhef>
    <naam>voornaam</naam>
    <adres>adres</adres>
    <postcode>postcode</postcode>
    <email>mailadres@mailadres.com</email>
    <rekeningnummer>012345678</rekeningnummer>
</klant>
</reservering>'

'SELECT
ReserveringNummer = Reservering.value('@reserveringsnummer', 'int'),
ReserveringStatus = Reservering.value('@status', 'varchar(50)'),
Park = Reservering.value('(park)[1]', 'varchar(50)'),
Accomodatie = Reservering.value('(accomodatie)[1]', 'varchar(50)'),
AantalBezoekers = Reservering.value('(aantalBezoekers)[1]', 'int'),
StartDatum = Reservering.value('(startdatum)[1]', 'date'),
EindDatum = Reservering.value('(einddatum)[1]', 'date'),
Voorkeur = Reservering.value('(voorkeur)[1]', 'varchar(50)'),
Opties = Opties.value('(optie)[1]', 'varchar(50)'),
Aanhef = Klant.value('(aanhef)[1]', 'varchar(50)'),
KlantNaam = Klant.value('(naam)[1]', 'varchar(50)'),
Adres = Klant.value('(adres)[1]', 'varchar(50)'),
Postcode = Klant.value('(postcode)[1]', 'varchar(50)'),
Email = Klant.value('(email)[1]', 'varchar(50)'),
Rekeningnummer = Klant.value('(rekeningnummer)[1]', 'varchar(50)')
FROM
@XML.nodes('/reservering') AS ReserveringTable(Reservering),
@XML.nodes('/reservering/opties') AS OptiesTable(Opties),
@XML.nodes('/reservering/klant') AS KlantTable(Klant)

INSERT INTO dbo.PRODUCT(naam)
  VALUES (Opties)
SELECT SCOPE_IDENTITY() AS ProductID;

INSERT INTO dbo.WONING(naam)
  VALUES (Accomodatie)
SELECT SCOPE_IDENTITY() AS WoningID;

INSERT dbo.KLANT(aanhef, naam, adres, postcode, emailadres, rekeningnummer)
  VALUES (Aanhef, KlantNaam, Adres, Postcode, Email, Rekeningnummer)
SELECT SCOPE_IDENTITY() AS KlantID;

INSERT INTO dbo.RESERVERING(reserveringsnummer, status, van_datum, tot_datum,       woning_id, product, voorkeur, prijs, klant, aantal_bezoekers)
   VALUES (ReserveringNummer, ReserveringStatus, StartDatum, EindDatum, WoningID, ProductID, Voorkeur, Prijs, KlantID, AantalBezoekers)

正如你所看到的那样,我也试图获取产品并将ID记录到我的RESERVERING表中,这是正确的方法吗?现在程序给我一个错误:无效的列名'columnname',其中columnname是值。它为我在INSERT语句中定义的所有值提供了相同的错误。

1 个答案:

答案 0 :(得分:1)

修正了问题。对于对解决方案感兴趣的人:

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>
</opties>
<klant>
    <aanhef>De heer</aanhef>
    <naam>name</naam>
    <adres>adres</adres>
    <postcode>postcode</postcode>
    <email>mail</email>
    <rekeningnummer>012345678</rekeningnummer>
</klant>
</reservering>'

INSERT INTO  [PRODUCT](
[naam])

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

DECLARE @ProductID AS int
SET @ProductID = @@IDENTITY

INSERT INTO  [WONING](
[naam])

SELECT
   Accomodatie = Reservering.value('(accomodatie)[1]', 'varchar(50)')
FROM
   @XML.nodes('/reservering') AS ReserveringTable(Reservering),
   @XML.nodes('/reservering/opties') AS OptiesTable(Opties),
   @XML.nodes('/reservering/klant') AS KlantTable(Klant)

DECLARE @WoningID AS int
SET @WoningID = @@IDENTITY

INSERT INTO  [KLANT](
[aanhef], [adres], [emailadres], [naam], [postcode], [rekeningnummer])

SELECT
   Aanhef = Klant.value('(aanhef)[1]', 'varchar(50)'),
   Adres = Klant.value('(adres)[1]', 'varchar(50)'),
   Email = Klant.value('(email)[1]', 'varchar(50)'),
   KlantNaam = Klant.value('(naam)[1]', 'varchar(50)'),
   Postcode = Klant.value('(postcode)[1]', 'varchar(50)'),
   Rekeningnummer = Klant.value('(rekeningnummer)[1]', 'varchar(50)')
FROM
  @XML.nodes('/reservering') AS ReserveringTable(Reservering),
  @XML.nodes('/reservering/opties') AS OptiesTable(Opties),
  @XML.nodes('/reservering/klant') AS KlantTable(Klant)

 DECLARE @KlantID AS int
 SET @KlantID = @@IDENTITY

 INSERT INTO  [RESERVERING](
   [aantal_bezoekers], [product], [reserveringsnummer], [status], [van_datum],      
   [tot_datum], [voorkeur], [woning_id], [klant])

 SELECT
    AantalBezoekers = Reservering.value('(aantalBezoekers)[1]', 'int'),
    @ProductID,
    ReserveringNummer = Reservering.value('@reserveringsnummer', 'int'),
    ReserveringStatus = Reservering.value('@status', 'varchar(50)'),
    StartDatum = Reservering.value('(startdatum)[1]', 'date'),
    EindDatum = Reservering.value('(einddatum)[1]', 'date'),
    Voorkeur = Reservering.value('(voorkeur)[1]', 'varchar(50)'),
    @WoningID,
    @KlantID
 FROM
   @XML.nodes('/reservering') AS ReserveringTable(Reservering),
   @XML.nodes('/reservering/opties') AS OptiesTable(Opties),
   @XML.nodes('/reservering/klant') AS KlantTable(Klant)