In my
last post, I demonstrated how to shape and bend XML from your existing tables in SQL Server. In this post I am going to go the other direction and shred the xml directly into SQL tables with a desired structure. I will also create a parent-child relationship between entities where no keys previously existed in the xml.
This approach uses the older OPENXML mechanisms and is distinct from the value() and node() methods introduced later. I believe this approach to be superior and easier to construct than that demonstrated by
Adam Machanic.
- I'm assuming here that you've loaded the xml into the @xmlDocument variable (as in my previous example)
- You need a document handle (@XmlDocumentHandle). As long as this handle remains open, the id's returned for each node do not change.
- Use the OPENXML function with the @XmlDocumentHandle and create an XPath query that finds the data for the you want.
- The value of 9 means to map attributes to your defined table, and handles really big documents.
- The table definition is in the WITH clause
- The @mp:id and @mp:parent are the identifier for the individual node and its parent. Every node in the document has a unique value that doesn't change; these are used to make our parent-child relationships work.
Here is some sample XML and SQL:
And here are some results: (sorry for the ugly tables)
StudentId | Id | FirstName | LastSurname |
2 | 1322C606-D644-497B-8548-207933921855 | Shelby | Barajas |
21 | 9F5B105B-0B03-4508-B7B4-AD1731A85B6E | Sarah | Stevens |
39 | 5757B9B9-C4AD-4B6D-B1A0-056B2D08B7BD | Gilbert | Fritz |
58 | DE2FF0BA-F23B-4323-87C9-FA4AF3C3FA44 | Debbie | Savage |
76 | AFE73075-5460-4FBD-858B-E8864E8E1A38 | Sandro | Miguel |
95 | 47E92DBE-AE26-4F52-B532-5F8BD9E02826 | Alicia | Dennis |
AddressId | StudentId | StreetNumberName |
14 | 2 | 654 Mission Hills |
32 | 21 | 123 Simons Way |
51 | 39 | 16 Green Hague Way |
69 | 58 | 123 Simons Way |
88 | 76 | 16 Green Hague Way |
107 | 95 | 25 North Clarendon Boulevard |
LanguageId | StudentId | LanguageDescriptorId |
114 | 95 | 524 |
LanguageUseId | LanguageId | LanguageUseTypeId |
116 | 114 | 1 |
Comments