1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
USE master;
GO
CREATE DATABASE TestImportXML;
GO
USE TestImportXML;
GO
CREATE TABLE facture (
id INT IDENTITY,
numero VARCHAR(20),
CONSTRAINT PK_facture PRIMARY KEY(id),
CONSTRAINT UK_facture UNIQUE(numero)
);
CREATE TABLE ligne (
id INT IDENTITY,
facture_ref INT NOT NULL,
designation VARCHAR(20) NOT NULL,
montant DECIMAL(18,2) NOT NULL,
CONSTRAINT PK_ligne PRIMARY KEY(id),
CONSTRAINT FK_ligne_facture_ref FOREIGN KEY(facture_ref) REFERENCES facture(id)
);
GO
DECLARE @Xml XML = '<factures>
<facture numero="456">
<ligne designation="truc" montant="45.21" />
<ligne designation="truc" montant="50.00" />
</facture>
<facture numero="789">
<ligne designation="machin" montant="1.23" />
</facture>
</factures>';
INSERT INTO facture(numero)
SELECT XmlTable.x.value('@numero', 'VARCHAR(20)') FROM @Xml.nodes('/factures/facture') AS XmlTable(x);
INSERT INTO ligne(facture_ref, designation, montant)
SELECT F.id, XmlLigne.x.value('@designation', 'VARCHAR(20)'), XmlLigne.x.value('@montant', 'DECIMAL(18,2)')
FROM @Xml.nodes('/factures/facture') AS XmlFacture(x)
CROSS APPLY XmlFacture.x.nodes('ligne') AS XmlLigne(x)
INNER JOIN facture AS F ON F.numero = XmlFacture.x.value('@numero', 'VARCHAR(20)') |
Partager