2009-11-09 4 views
1

J'ai un fichier XML et je l'ouvre dans SQL Server en utilisant OPENXML, puis je lis les valeurs dans le fichier XML et les insère dans la table. On suppose que la structure XML est comme ceSQL Server 2008 - Sélection de plusieurs lignes à partir de l'instruction OPENXML

<Student> 
    <name>XYZ</name> 
    <id>123</id> 
    <fathersname>XYS</fathersname> 
    <fathersid>3489</fathersid> 
</Student>". 

Maintenant, je dois ajouter ceci comme deux lignes différentes et la DB devrait ressembler à ceci
NameID
XYZ 123
XYS 3489
Comment puis-je lire ce XML et insert comme deux lignes différentes en utilisant une seule instruction OPENXML?

Répondre

1
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); 
+0

Hi .. Est-il possible de le faire avec une seule instruction insert et select? En fait, je ne cherchais que ça .. – Prabhu

+0

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 ... –

+1

Juste pour la course regardez UPDATE 2. –

Questions connexes