I like to use my blog as a library for myself, to be able to easily find solutions I have used before. Here is a simple example of querying an XML string using SQL.
In this example I have inserted one XML string into a temporary table, with two items called pages, and two reference of type ‘book’. The resulting select statements will pull any and all pages from the XML string, and any ‘book’ references. There can be multiple types of references with varying fields, which you can query in the same way, simply be altering the text in the .nodes in the FROM statement.
DECLARE @xml as XML DECLARE @tblXML AS TABLE (Response xml ) INSERT INTO @tblXML SELECT '<response> <pages> <page> <id>1376745</id> <name>First Page</name> </page> <page> <id>1376746</id> <name>Second Page</name> </page> </pages> <references> <reference> <type>book</type> <id>425285</id> <name>How I met your mother</name> <activestatus>false</activestatus> </reference> <reference> <type>book</type> <id>425286</id> <name>Covered in Bees</name> <activestatus>true</activestatus> </reference> </references> </response>' as Response SELECT @xml = Response from @tblXML SELECT ID = t.item.value('(id)[1]','int'), BookName = t.item.value('(name)[1]', 'nvarchar(50)'), IsActive = case when t.item.value('(activestatus)[1]', 'nvarchar(10)') = 'false' THEN cast(0 as bit) ELSE cast(1 as bit) END FROM @xml.nodes('/response/references/reference[type/text() = "book"]') as t(item) SELECT ID = t.item.value('(id)[1]','int'), PageName = t.item.value('(name)[1]', 'nvarchar(50)') FROM @xml.nodes('/response/pages/page') as t(item)
You can also query a table directly rather than storing the XML in a variable by using CROSS APPLY, like this.
SELECT ID = t.item.value('(id)[1]','int'), PageName = t.item.value('(name)[1]', 'nvarchar(50)') FROM @tblXML x CROSS APPLY Response.nodes ('/response/pages/page') as t(item)
I hope you find this useful.