The XML data type supports a
number of methods providing various operations on the XML document. An
operation on an XML document is applied to one or more elements or
attributes at a specific location. To perform an operation, the
location of the specific element needs to be specified.
Common operations on XML documents typically
involve reading values from elements or attributes, querying for
information, or making modifications to the XML document by inserting,
updating, or deleting elements or attributes.
This section begins with an overview of the XPath language to provide a foundation in which to cover the methods.
XPath
XPath is an expression language that
provides quick and efficient processing of values and the locating of
XML elements and attributes in an XML document. It also allows for easy
navigation through an XML tree.
The concept is that each element and attribute has a unique “path,” for example:
<Items>
<ItemNumber>1234</ItemNumber>
<ItemNumber>2345</ItemNumber>
</Items>
In the preceding code, the path to the first ItemNumber element is /Items/ItemNumber[1], and the path to the second ItemNumber element is /Items/ItemNumber[2]. Each element and attribute within an XML document can be uniquely identified and processed using an XPath expression.
All the XML data type methods accept XPath
expressions to specify the target element or attribute on which the
given operation is performed.
XPath is a language used to create expressions
that can address parts of an XML document. It can also be used to
manipulate numbers and strings, and can match a set of nodes in an XML
document. As such, we can use XPath to identify nodes in an XML
document based on their type, name, and values.
value()
The value()
method is the most useful of the methods, providing the ability to
retrieve scalar values from an XML document as relational columns. The value()
method takes an XQuery expression and evaluates the expression to a
single node. During the process the results are cast to the specified
SQL Server data type and returned. The following example illustrates
this using an XML variable.
DECLARE @var xml
SET @var = ‘<Order OrderID="1">
<Item>
<ItemNumber>V001</ItemNumber>
<Quantity>1</Quantity>
<Price>299.99</Price>
</Item>
</Order>'
SELECT @var.value('(Order/@OrderID)[1]', ‘INT') as orderid,
@var.value('(Order/Item/ItemNumber)[1]', ‘NVARCHAR(50)') as itemnumber
The following example illustrates the same functionality but directly queries an
XML data type column.
SELECT ItemData.value('(Order/@OrderID)[1]', ‘INT') as orderid,
ItemData.value('(Order/Item/ItemNumber)[1]', ‘NVARCHAR(50)') as itemnumber
FROM ItemInfo
nodes()
Suppose you want to return the values from nodes that match a specific expression. The nodes() method returns a rowset representation of the XML document. An XQuery operation can be performed on each node returned by the nodes() method.
DECLARE @var xml
SET @var = ‘
<Item>
<ItemNumber>V001</ItemNumber>
<ItemNumber>A017</ItemNumber>
<ItemNumber>P002</ItemNumber>
</Item>'
SELECT var.value('.','NVARCHAR(10)') as ItemNumber
FROM @var.nodes('/Item/ItemNumber') o(var)
The following example illustrates the same functionality but directly queries an XML data type column.
SELECT OrderID,
ItemData.value('(Order/Item/ItemNumber)[1]', ‘NVARCHAR(50)') as itemnumber
FROM ItemInfo
CROSS APPLY ItemData.nodes('/Order/Item') o(x)
The question from the preceding example is why CROSS APPLY is used. When working with XML columns, multiple XML documents are processed in a single batch. The CROSS APPLY operator helps with this processing.
exist()
The exist()method
checks for the existence of a specified element or attribute specified
in the XPath expression. The following example uses the exist() method to filter rows that have a specific item number:
SELECT OrderID
FROM ItemInfo
WHERE ItemData.exist('Order/Item/ItemNumber = "A017"') = 1
The exist() method returns true (1) if an element or attribute exists in the XML document that is specified in the XPath expression.
query() and modify()
The query() method takes an XQuery expression and evaluates it to a list of XML elements that can be accessed and processed further. The modify() method is used to modify XML documents, either insert, update, and delete operations on elements or attributes.