CREATE TABLE dbo.Person(ID int, [Name] varchar(50))
DECLARE @docHandle int
DECLARE @xmlDocument XML
SET @xmlDocument = N'<ROOT>
<Student>
<name>XYZ</name>
<id>123</id>
<fathersname>XYS</fathersname>
<fathersid>3489</fathersid>
</Student>
<Student>
<name>ABC</name>
<id>456</id>
<fathersname>DEF</fathersname>
<fathersid>7859</fathersid>
</Student>
</ROOT>'
EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument
-- student's data first
INSERT INTO dbo.Person
SELECT *
FROM OPENXML(@docHandle, N'/ROOT/Student',2)
WITH (id int, name varchar(50))
-- now insert father's data
INSERT INTO dbo.Person
SELECT *
FROM OPENXML(@docHandle, N'/ROOT/Student',2)
WITH (fathersid int, fathersname varchar(50))
SELECT * FROM dbo.Person
EXEC sp_xml_removedocument @docHandle
DROP TABLE dbo.Person
Pour ouvrir à partir d'un fichier:
declare @xmlDocument XML
SET @xmlDocument=(SELECT * FROM OPENROWSET(
BULK 'c:\Temp\Student.xml',
SINGLE_BLOB) AS x)
MISE À JOUR:
Désolé, ne voyez pas que vous essayez de diviser <father>
dans une autre ligne, j'ai simplement ajouté une INSERT pour ça. Si vous avez besoin de plus de contrôle sur le processus de chargement, vous pouvez toujours envisager de configurer un travail ETL dans SSIS.
MISE À JOUR 2
est bien ici d'une manière créative avec un insert seulement, mais deux - sélectionne pas sûr sur les performances du tout. Encore une fois, nous divisons un enregistrement en deux lignes.
INSERT INTO dbo.Person
SELECT
x.e.value('id[1]', 'int') AS "id"
,x.e.value('name[1]', 'varchar(10)') AS "Name"
FROM @xmlDocument.nodes('/ROOT/Student') AS x(e)
UNION
SELECT
x.e.value('fathersid[1]', 'int') AS "id"
,x.e.value('fathersname[1]', 'varchar(10)') AS "Name"
FROM @xmlDocument.nodes('/ROOT/Student') AS x(e);
Hi .. Est-il possible de le faire avec une seule instruction insert et select? En fait, je ne cherchais que ça .. – Prabhu
Je ne vois pas comment - vous essayez de diviser un enregistrement en deux lignes dans un seul insert. Mais alors il peut y avoir une façon créative en quelque sorte ... –
Juste pour la course regardez UPDATE 2. –