Introduktion till OpenXML i SQL Server, del 3Innehållsförteckning 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:
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! |