Labb LABB 15 XML användande i praktiken Plushögskolan Frågeutveckling inom MSSQL - SU14
I dagens labb ska vi försöka använda information från XML. Innehåll XML-fil... 2 Lista upp maten... 3 Spara din XML... 4 Pris och kalorier... 5 Manipulera data... 6 Lite ändringar i menyn... 7 Filtrering av XML... 8 Beräkningar... 9 FOR XML... 10 1
XML-fil Vi börjar med att läsa in XMLfil. Med dagens exempel så fick du med filen Nom.xml, om inte ladda ner del från http://www.w3schools.com/xml/simple.xml Jag döpte om filen för Nom lät bättre än Simple. Declare @xmldata XML; Declare @sql varchar(max); SELECT @xmldata = CONVERT(xml,[BulkColumn]) FROM OPENROWSET(BULK '{Sökväg till dina labbfiler}\labb\nom.xml', SINGLE_BLOB) as [XmlData]; Select @xmldata; Det första som händer är att vi skapar variabler. OPENROWSET fungerar inte så bra med variabler som filnamn, så vi hårdkodar det just nu. I Select satsen tilldelat vi @xmldata XMLdata som skapats av Convert. Med OpenRowset läser vi in filen som en Bulk, alltså en klump data som inte behandlats på något sätt. Den blir av typen SINGLE_BLOB som talar om att den är en rad, en kolumn data i varbinary(max). Detta för att inte behöva bekymra sig med konverteringar. [XmlData] i slutet är bara ett namn för själva kolumnen. Såja, nu kan du använda koden från gårdagens labb för att läsa in tabellen in i din databas. Declare @xmldata XML; Declare @sql varchar(max); Declare @docid int; SELECT @xmldata = CONVERT(xml,[BulkColumn]) FROM OPENROWSET(BULK '{Sökväg till dina labbfiler}\labb\nom.xml', SINGLE_BLOB) as [XmlData]; exec sp_xml_preparedocument @DocID OUTPUT, @xmldata; select * from OPENXML(@docID,'/') order by id, parentid exec sp_xml_removedocument @DocID Sådärja nu ska vi experimentera med XMLkoden 2
Lista upp maten Precis som i gårdagens övning så kan vi få fram listan på mat genom att använda with select * from OPENXML(@docID,'//food') with ( Name varchar(max) 'name' ) Ändra koden så att den visar Price, Calories och Description Nu när du sett hur datan ser ut, då ska vi börja leka med det. 3
Spara din XML Nu ska vi stoppa in XMLdatat i en tabell. Att ha allt i en rad och en kolumn är inte så bra och det är precis vad som händer om vi försöker importera XMLn till tabellen. Vi löser det såhär: 1. Skapa en tabell kallad Food som ska innehålla a. ID (autoräknande) b. XML för maträtt 2. Importera datat in i din tabell, en rad per maträtt Det låter enkelt, men det är det inte eller jo, när man vet hur. I gårdagens exempel importerade vi in färdiga tabeller som omvandlades till XMLkod. Då kunde vi splittra XML-raderna baserat på ID, men nu importerar vi från XML direkt. Då får man göra lite annorlunda. En rekursiv-aktig Select är en bra lösning i det här fallet. insert into food select XmlKod.Rad.query ('.') from @xmldata.nodes('//food') as XmlKod(Rad); Det ser lite knasigt ut, men det är kortfattat så att vi för en sökning på själva XMLkoden och plockar fram all data som finns vid //food, detta läggs i en Fejkad tabell ( XmlKod ) med en fejkad datarad ( Rad ). Då vår SQL-Query selectar all XML-data så får den alltså fram allt som ligger i samma nivå som food. Prova :) 4
Pris och kalorier Skriv Querys som letar upp (och visar information om) 1. Den dyraste maträtten 2. Rätten med högst antal kalorier 3. Billigaste rätten 4. Rätten med minst kalorier Jag hjälper dig med den första för att få dig på rätt spår Select top 1 Food.value('(//price)[1]', 'money') as price from food order by price desc Queryn kommer att leta upp den dyraste rätten, resten av informationen får du söka upp själv :) 5
Manipulera data Nu ska du skapa en XML rad Name Fried Macaroni and cheese Price $7.50 Description Fried Macaroni and cheese with bacon bits and sour cream Calories 1756 Skapa den och spara den i din tabell. För mer inspiration om fantastiska rätter, se http://www.buzzfeed.com/bennyjohnson/17-heart-stopping-foods-at-the-iowa-statefair#.orl9kz4j30 6
Lite ändringar i menyn Kocken har fått slut på ägg, radera raden med mat där ägg Döp om Fried Macaroni and cheese till Dangerous & Delicious fried Macaroni and cheese 7
Filtrering av XML Skriv Querys som 1. Visar bara upp Waffles-rätter 2. Söker upp rätten som innehåller ägg 3. Visar rätter som inte är våfflor 8
Beräkningar Skriv queries som 1. Räknar ut mängden kalorier om man äter upp en st av alla våffelrätter 2. Räknar ut medel av mängden kalorier på våffelrätterna 3. Sorterar upp maträtterna så att minsta mängd kalorier, och lägsta pris kommer först 4. Räknar ut antal kalorier per dollar, per maträtt 9
FOR XML Exportera din sorterade tabell, och spara koden som du får. Kopiera din SQL-kod och skriv över informationen i filen. Prova nu med att läsa in XML-koden igen. 10