【问题标题】:Inserting XML data in SQL database在 SQL 数据库中插入 XML 数据
【发布时间】:2013-11-29 20:57:45
【问题描述】:

如何将我的 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 语句中定义的所有值,它给了我同样的错误。

【问题讨论】:

  • 你用的是什么数据库?
  • SQL Server 2008 R2,我正在使用 Microsoft SQL Server Management Studio

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


【解决方案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)

【讨论】:

    猜你喜欢
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多