T-SQL Tutorial

SELECT child nodes dynamically


In SQL Server, XML data can be stored in XML data type columns. To retrieve specific child nodes from an XML column dynamically, you can use the nodes() method with the CROSS APPLY operator. Here's is the first example:


First example

Suppose you have a table Products with an XML column ProductDetails that contains information about each product, including the product name, price, and category. The XML structure looks like this:

<Product>
<Name>Product 1</Name>
<Price>10.00</Price>
<Category>Category 1</Category>
</Product>

To select the Name and Price child nodes dynamically, you can use the following SQL query:

SELECT
ProductDetails.value('(Product/Name)[1]', 'nvarchar(max)') AS Name,
ProductDetails.value('(Product/Price)[1]', 'money') AS Price
FROM Products
CROSS APPLY ProductDetails.nodes('/Product') AS ProductDetails(Product_Details)

In this query, the nodes() method with the CROSS APPLY operator retrieves all Product elements from the ProductDetails column, and the value() method with an XQuery expression retrieves the Name and Price child nodes from each Product element.

Note that the value() method uses a numeric predicate [1] to select the first occurrence of each child node, assuming that each Product element has exactly one Name and Price child node. If the XML structure varies, you may need to modify the XQuery expressions accordingly to retrieve the desired child nodes dynamically.


Second example

In SQL Server, it is possible to query and extract data from XML documents using the SELECT statement. One common scenario is selecting child nodes dynamically from an XML document.

To select child nodes dynamically, you need to use the nodes() method and the value() method in conjunction with the SELECT statement. The nodes() method allows you to extract a set of nodes from an XML document based on an XPath expression, and the value() method allows you to extract the value of a node.

Here's an example of how to select child nodes dynamically from an XML document:

DECLARE @xml XML = '
<bookstore>
<book category="aaa">
<title>Title A</title>
<author>Author 1</author>
</book>
<book category="bbb">
<title>Title B</title>
<author>Author 2</author>
</book>
</bookstore>
';

SELECT
bookNode.value('@category', 'varchar(50)') AS Category,
bookNode.value('(title)[1]', 'varchar(100)') AS Title,
bookNode.value('(author)[1]', 'varchar(100)') AS Author
FROM
@xml.nodes('/bookstore/book') AS bookstore(bookNode);

In this example, we declare an XML variable called @xml that contains a sample XML document representing a bookstore with two books. We then use the nodes() method to extract a set of nodes from the XML document that match the XPath expression /bookstore/book.

The nodes() method returns a table with a single column called bookNode that contains each matching node as a row. We use the value() method to extract the value of the category, title, and author child nodes from each row of the table.

Note that the XPath expressions used in the value() method are relative to the context node, which is the bookNode column in this case. The [1] notation is used to select the first occurrence of the child node, as there may be multiple occurrences of the same child node within each bookNode.

In conclusion, selecting child nodes dynamically from an XML document in SQL Server requires the use of the nodes() method and the value() method in conjunction with the SELECT statement. By using XPath expressions, you can extract specific sets of nodes and their values from an XML document.