Introduktion till OpenXML i SQL Server, del 3

Innehållsförteckning
Innan vi börjar
Läsa ett XML-dokument
Ett mer avancerat exempel
Lägga in i en tabell


Lägga in i en tabell

Äntligen kommer vi till det mest intressanta, att lägga in data i en tabell. Vi kommer att använda oss av föregående exempel, och skapar därför en tabell som heter Person. Därefter lägger vi in data från XML-filen, till denna tabell. Detta blir SQL-frågorna:


     1: CREATE TABLE Person
     2: (
     3:         PersonId INTEGER IDENTITY (1,1) NOT NULL,
     4:         Fornamn VARCHAR(15),
     5:         Efternamn VARCHAR(15),
     6:         Alder INTEGER,
     7:         AvdelningsID INTEGER
     8: )
     9: GO
    10: Declare @resultDoc int, @xmlDoc varchar(4000)
    11: 
    12: Set @xmlDoc = N'
    13: <?xml version="1.0" encoding="ISO-8859-1"?>
    14: <Anställda>
    15:         <Avdelning Id="3">
    16:                 <Person Id="1">
    17:                         <Förnamn>Anna</Förnamn>
    18:                         <Efternamn>Andersson</Efternamn>
    19:                         <Ålder>26</Ålder>
    20:                 </Person>
    21:                 <Person Id="2">
    22:                         <Förnamn>Bertil</Förnamn>
    23:                         <Efternamn>Johansson</Efternamn>
    24:                         <Ålder>48</Ålder>
    25:                 </Person>
    26:         </Avdelning>
    27:         <Avdelning Id="5">
    28:                 <Person Id="3">
    29:                         <Förnamn>Sivert</Förnamn>
    30:                         <Efternamn>Persson</Efternamn>
    31:                         <Ålder>35</Ålder>
    32:                 </Person>
    33:         </Avdelning>
    34: </Anställda>'
    35: 
    36: EXEC sp_xml_preparedocument @resultDoc OUTPUT, @xmlDoc
    37: 
    38: SET IDENTITY_INSERT Person ON
    39: INSERT INTO Person (PersonId, Efternamn, Fornamn, Alder, AvdelningsID)
    40: SELECT PersonId, Efternamn, Förnamn, Ålder, AvdelningsID 
    41: FROM OpenXML(@resultDoc, N'Anställda/Avdelning/Person', 3)
    42: WITH (
    43:         PersonId INTEGER '@Id',
    44:         Förnamn VARCHAR(15),
    45:         Efternamn VARCHAR(15),
    46:         Ålder INTEGER,
    47:         AvdelningsID INTEGER '../@Id'
    48: )
    49: SET IDENTITY_INSERT Person OFF
    50: 
    51: EXEC sp_xml_removedocument @resultDoc
    52: 


På rad 1 till 8 skapar vi en ny tabell som heter Person. Därefter på rad 10 till 36 är det exakt likadant som tidigare. Det är inte förrän på rad 38 som det blir något nytt. Eftersom vi har en Primärnyckel som ökas med ett (1) automatiskt, så kan vi inte sätta in vilket värde som helst i den kolumnen när vi gör en INSERT. Utan för att vi ska få sätta in de värden vi har fått från XML-dokumentet, måste vi sätta IDENTITY_INSERT till ON, vilket vi gör här.

På rad 39 börjar vår INSERT-fråga. Den är egentligen inte så konstig, om vi tänker på en vanlig INSERT-fråga med en SELECT-del. För det är precis det vi har här, en INSERT-fråga, som hämtar värdena från en annan tabell genom att använda SELECT.

På rad 40 väljer vi ut vad vi vill lägga in i tabellen Person. Precis som vid en vanlig INSERT så spelare det ingen roll vad kolumnerna heter, utan det är ordningen på dem.

Rad 41 till 49 är lika som förut, och på rad 51 gör vi motsatsen till vad vi gjorde på rad 36.

Om vi nu gör denna enkla fråga:


     1: SELECT * FROM Person
 

Får vi detta resultat:

  PersonId Förnamn Efternamn Ålder AvdelningsId
1 1 Anna Andersson 26 3
2 2 Bertil Johansson 48 3
3 3 Sivert Persson 35 5

Vilket är exakt samma tabell som när vi gjorde en SELECT-fråga direkt mot XML-filen. Kort sagt, vi har lyckats få in vår data i tabellen Person!

[ 1 ] [ 2 ] [ 3 ] [ Next ]


Home | Copyright © 2002 - 2005 Kristofer Gäfvert