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