XML via SQL gör det möjligt för datorer att utbyta data. |

De flesta programmerare känner till "extensible mark-up language" eller XML. XML används ofta för att utbyta data mellan två datorer. De flesta moderna webbapplikationer och webbleverantörer hanterar XML. SQL Server 2005 och uppdaterade versioner kan generera XML från en SQL-databas.

När den används med SQL-frågan, representerar FOR XML- klausulen frågan från SQL som XML. Följande artikel ger exempel på hur du använder FOR XML .

Gå med i fråga

Samlingsfrågan kombinerar rader från två eller flera tabeller baserat på en relaterad kolumn mellan dem.

Gå med i Query and Pubs Database

Användaren måste förstå pubens databas för att dessa exempel ska vara vettiga. Omvänt är det inte obligatoriskt att ha Pubs-databas för att använda FOR XML och det är möjligt att montera dessa exempel på liknande sätt med andra schematabeller.

Vi kommer att använda tabellen Butiker och försäljning representerade i pubens databas under hela artikeln. Titta nu på Join- frågan som visas i figur 1:

Bild 1: Försäljning av butiker via pubdatabas |

Frågan som visas i figur 1 drar tre kolumner från tabellen Butiker. De två sista kolumnerna ord_num och antal dras från försäljningstabellen. Sammantaget visar frågan försäljningen som uppnåtts av butikerna. Även om vi har uppsägningar i kolumnen stornamn, behöver vi dessa fel i den här artikeln för ett senare exempel med FOR XML .

Genererar RAW XML

FOR XML RAW- konstruktionen i slutet av Select-frågan ansvarar för att generera XML-innehållet. Även om utgången är XML ser det ut som de data som returneras i rad- och kolumnformat som vi vanligtvis ser utgångsfönstret för SQL Server Management Studio (SSMS). Exempel 1-frågekoden visas här:

 - Exempel 01 -Generera RAW XML SELECT store.stor_id AS store_id, store.stor_name, store.city, sale.ord_num, sale.qty FRÅN Butiker store Inner Join Sales sale ON store.stor_id = sale.stor_id FÖR XML RAW; 

När vi kör ovanstående fråga får vi XML-resultatet som visas i figur 2:

Bild 2: SQL FÖR XML RAW-utgång sansar vissa rader |

Rå XML med rotnod

I figur 2 såg vi ett XML-fel i den andra raden med ett duplicerat elementnamn som heter "rad" närvarande i XML. För att undvika dubblering kan vi lagra alla rader i ett rotelement. Ta en titt på SQL-frågekoden i exempel 2:

 - Exempel 02 - Raw XML med Root SELECT store.stor_id AS store_id, store.stor_name, store.city, sale.ord_num, sale.qty FRÅN Butiker store Inner Join Försäljning försäljning ON store.stor_id = sale.stor_id FÖR XML RAW, ROOT ( 'ORDER'); 

Vi kan lägga till ROOT- konstruktionen till FOR XML- klausulen i SQL och som kommer att ordna alla resulterande rader som ett enda barnelement i den roten. I exemplet ovan (2) benämnade vi rotelementet ORDERS . Se den resulterande XML i figur 3:

Bild 3: För XML RAW med rotnod |

Ovanstående figur 3 XML visar att alla poster är bifogade av rotelementet ORDERS . Som ett resultat kan vi se att den röda snodda linjen i den andra raden från figur 1 är borta. XML är felfri nu bara genom att använda en rotnod. Observera att en förälder (eller rot) kan ha flera barn med samma elementnamn.

Namnge raden i RAW XML

Varje rad i figurerna 2 och 3 heter som standard "rad". Vi kan istället tillhandahålla ett meningsfullt namn för den rad som returneras av frågan. Exempel 3 kodkod hur:

 - Exempel 03 - Namnge Row of Raw XML SELECT store.stor_id AS store_id, store.stor_name, store.city, sale.ord_num, sale.qty FRÅN Butiker butik Inner Join Sales sale ON store.stor_id = sale.stor_id FOR XML RAW ('Order'), ROOT ('ORDERS'); 

Notera användningen av radnamn i slutet av FOR XML RAW . I exemplet ovan bad vi att namnge varje rad för "Order" som följaktligen producerade XML-namnet på elementrad som Order . Den resulterande XML-frågeställningen visas i figur 4:

Bild 4: XML RAW med radnamn |

Ändra attribut som element

I alla tidigare exempel visar XML-resultaten kolumnnamnet och dess värden är attribut. Vi kan visa dessa attribut som element så att XML är lättläst. Exempel 4-kod visar hur:

 - Exempel 04 Ändra attribut som element SELECT store.stor_id AS store_id, store.stor_name, store.city, sale.ord_num, sale.qty FRÅN Butiker store Inner Join Sales sale ON store.stor_id = sale.stor_id FÖR XML RAW (' Beställ '), ROOT (' ORDERS '), element; 

Som standard kommer FOR XML- konstruktionen att visa kolumnerna som attribut. I ovanstående kodexempel använde vi nyckelordet "ELEMENTS" för att visa kolumnerna som element. XML-resultatet i figur 5 visar hur attributen visas som element:

Bild 5: FÖR XML RAW-kolumner som element |

FÖR XML AUTO Underhåller hierarkin

Låt oss titta på föregående XML-utgång i figur 5 igen. Elementen store_id, stor_name och city visas två gånger eftersom det finns två försäljningar i butiken 6380 med två olika ordernummer. Vi kan undvika denna upprepning genom att använda FOR XML AUTO istället för FOR XML RAW . Exempel 5 visar detta:

 - Exempel 05 Behåll hierarki SELECT store.stor_id AS store_id, store.stor_name, store.city, sale.ord_num, sale.qty FRÅN Butiker butik Inner Join Försäljning försäljning ON store.stor_id = sale.stor_id FÖR XML AUTO, ROOT (' ORDERS '), element; 

Utgången från den resulterande XML visas i figur 6:

Bild 6: FÖR XML AUTO-utgångsexempel |

Det finns två informationer som vi bör märka. Den ena är kolumnordningen i markeringsklausulen för frågan och den andra är FOR XML AUTO i stället för FOR XML RAW . Eftersom butikskolumnerna är ordnade före kolumnen Försäljning, i den resulterande XML behandlas försäljningselementen som ett barn. Observera att det bara finns ett Store-element för dessa två försäljningar (markerat gult).