Avatar billede Lasse Novice
13. juni 2007 - 03:02 Der er 8 kommentarer og
1 løsning

Hvordan indsaettes et xml doc nemmest?

Hej alle sammen

Jeg bruger sql server 2005

Jeg skal have et xml dok indsat i min sql server 2005. Jeg er interesseret i at finde en hurtig loesning der bruger en testet teknologi. Hvad er smartest?

Mit xml dok er noget tilsvarende dette:

<Konstruktion Name="Hus">
<Afdeling Name="Stue">
  <Objekt Name="Spisebord">
  <SubObjekt Name="BordSkaaner" />
  </Objekt>
</Afdeling>
</Konstruktion>

som skal indsaettes i tabellerne
Konstruktion (pk KonstruktionId)
Afdeling (pk AfdelingId, fk KonstruktionId)
Objekt (pk ObjektId, fk AfdelingId)
SubObjekt (fk ObjektId).

Relationerne er opbygget via de keys som er angivet i parenteserne.
Avatar billede dr_chaos Nybegynder
13. juni 2007 - 17:09 #1
Du skal bruge noget openxml:
http://msdn2.microsoft.com/en-us/library/ms345110(SQL.90).aspx
Er et stykke nede på siden.
Når du bruger openxml kan du arbejde med det som om det var en tabel.
Avatar billede Lasse Novice
13. juni 2007 - 17:52 #2
problemet er ikke at indsaette det, det er at uddrage de primary keys saa jeg kan indsaette underlaeggende tabeller
Avatar billede dr_chaos Nybegynder
13. juni 2007 - 18:12 #3
Du skal nok importerer det hele indtil en import tabel og så indsætte det derfra.
Så kan du selecte @@IDENTITY eller SCOPE_IDENTITY() for hver række.
På den måde kan du også tjekke at f.eks. et konstruktion med name=Hus eksisterer og hvis ikke kan du indsætte den.
Avatar billede Lasse Novice
13. juni 2007 - 22:20 #4
import tabel == temp tabel?

Kunne du lave en lille pseudo kode til hvordan det kan indsaettes... Som jeg ser det kan det kun laves via en insert saetning for HVER row, men der er maaske en anden loesning...
Avatar billede dr_chaos Nybegynder
19. juni 2007 - 08:48 #5
Her er et lille del af noget jeg selv bruger:

DECLARE @hDoc int
SET @xmlE='Host/DataSt'+@xmlE
-- Hent XML fra Reference_order
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xml
INSERT INTO CustomerImport (Imported,Alias,INSTNR,FORBNR)
  SELECT
                          0 as Imported,
                    Alias,
                    INSTNR,
                    FORBNR
FROM OPENXML( @hDoc,@xmlE  ,2)
WITH(
Alias varchar(255)  '../Alias',
INSTNR VARCHAR(255) 'INSTNR'
FORBNR VARCHAR(255) 'INSTNR'
)
Avatar billede dr_chaos Nybegynder
19. juni 2007 - 08:56 #6
Her er et eksempel baseret på det dy har:

DECLARE @Xml varchar(8000),@hDoc int
SET @Xml='<?xml version="1.0" encoding="utf-8"?>
<root>
<Konstruktion Name="Hus">
<Afdeling Name="Stue">
  <Objekt Name="Spisebord">
  <SubObjekt Name="BordSkaaner" />
  </Objekt>
</Afdeling>
</Konstruktion>
<Konstruktion Name="Hus1">
<Afdeling Name="Stue1">
  <Objekt Name="Spisebord1">
  <SubObjekt Name="BordSkaaner1" />
  </Objekt>
</Afdeling>
</Konstruktion>
</root>'

EXEC sp_xml_preparedocument @hDoc OUTPUT, @xml

SELECT * FROM OPENXML( @hDoc,'root/Konstruktion')
WITH (
KonsName VARCHAR(255) '@Name',
AfdelingName VARCHAR(255) 'Afdeling/@Name',
ObjektName VARCHAR(255) 'Afdeling/Objekt/@Name' ,
SubObjektName VARCHAR(255) 'Afdeling/Objekt/SubObjekt/@Name'
)

EXEC sp_xml_removedocument @hDoc
Avatar billede dr_chaos Nybegynder
19. juni 2007 - 08:56 #7
vær opmærksom på at jeg har tilføjet en root node.
Avatar billede Lasse Novice
19. juni 2007 - 16:13 #8
Ok takker. Jeg fik lavet det via det indbyggede nodes.value(...).

Ikke desto mindre, et svar => point
Avatar billede dr_chaos Nybegynder
19. juni 2007 - 17:50 #9
svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester