SQL Server Central is supported by Red Gate Software Ltd.
 
Log in  ::  Register  ::  Not logged in
Search:  
 
 

XML Workshop II - Reading values from XML variables

By Jacob Sebastian, 2007/06/06

Total article views: 10203 | Views in the last 30 days: 300

Introduction

In Part IV of my Sales Order Workshop, I had presented a basic example using the XML data type introduced by SQL Server 2005. Recently there were some questions and requests in the discussion forum asking for more detailed examples showing XML processing.

I also had another article published with some advanced XML examples and I am trying to present a few more examples in this article.

One of the most useful methods exposed by the XML data type is the Value() method. Here, I am presenting 9 more examples which demonstrates the different XML operations that we could perform with the Value() method.

Examples

Example 1

    1 /*

    2     The following TSQL retrieves attribute values from the XML variable.

    3     Attribute names are prefixed with "@".

    4 */

    5 

    6 DECLARE @x XML

    7 SET @x = '

    8 <orderInfo>

    9     <item code="A001" category="FOOD" subcategory="Candies">

   10         <description>Nestle Munch</description>

   11         <qty>10</qty>

   12         <rate>11.25</rate>

   13     </item>

   14     <item code="A002" category="FOOD" subcategory="Biscuits">

   15         <description>Britania Good Day</description>

   16         <qty>15</qty>

   17         <rate>12.25</rate>

   18     </item>

   19 </orderInfo>'

   20 

   21 SELECT

   22     x.item.value('@code[1]', 'VARCHAR(20)') AS ItemCode,

   23     x.item.value('@category[1]', 'VARCHAR(20)') AS category,

   24     x.item.value('@subcategory[1]', 'VARCHAR(20)') AS subcategory

   25 FROM @x.nodes('//orderInfo/item') AS x(item)

   26 

   27 /*

   28 OUTPUT:

   29 

   30 ItemCode             category             subcategory

   31 -------------------- -------------------- --------------------

   32 A001                 FOOD                 Candies

   33 A002                 FOOD                 Biscuits

   34 

   35 (2 row(s) affected)

   36 */

Example 2

    1 /*

    2     The following TSQL retrives values from XML nodes.

    3     Note that, here we dont use the "@" sign to indicate that

    4     we need values of nodes not attributes.

    5 */

    6 

    7 DECLARE @x XML

    8 SET @x = '

    9 <orderInfo>

   10     <item code="A001" category="FOOD" subcategory="Candies">

   11         <description>Nestle Munch</description>

   12         <qty>10</qty>

   13         <rate>11.25</rate>

   14     </item>

   15     <item code="A002" category="FOOD" subcategory="Biscuits">

   16         <description>Britania Good Day</description>

   17         <qty>15</qty>

   18         <rate>12.25</rate>

   19     </item>

   20 </orderInfo>'

   21 

   22 SELECT

   23     x.item.value('description[1]', 'VARCHAR(20)') AS description,

   24     x.item.value('qty[1]', 'INT') AS qty,

   25     x.item.value('rate[1]', 'FLOAT') AS rate

   26 FROM @x.nodes('//orderInfo/item') as x(item)

   27 

   28 /*

   29 OUTPUT:

   30 

   31 description         qty         rate

   32 -------------------- ----------- ----------------------

   33 Nestle Munch         10         11.25

   34 Britania Good Day    15         12.25

   35 

   36 (2 row(s) affected)

   37 */

Example 3

 

    1 /*

    2     Well, this query retrieves attribute values as well as values

    3     from nodes. Note that attribute values are specified with an "@"

    4     character.

    5 */

    6 DECLARE @x XML

    7 SET @x = '

    8 <orderInfo>

    9     <item code="A001" category="FOOD" subcategory="Candies">

   10         <description>Nestle Munch</description>

   11         <qty>10</qty>

   12         <rate>11.25</rate>

   13     </item>

   14     <item code="A002" category="FOOD" subcategory="Biscuits">

   15         <description>Britania Good Day</description>

   16         <qty>15</qty>

   17         <rate>12.25</rate>

   18     </item>

   19 </orderInfo>'

   20 

   21 SELECT

   22     x.item.value('@code[1]', 'VARCHAR(20)') AS ItemCode,

   23     x.item.value('@category[1]', 'VARCHAR(20)') AS category,

   24     x.item.value('@subcategory[1]', 'VARCHAR(20)') AS subcategory,

   25     x.item.value('description[1]', 'VARCHAR(20)') AS description,

   26     x.item.value('qty[1]', 'INT') AS qty,

   27     x.item.value('rate[1]', 'FLOAT') AS rate

   28 FROM @x.nodes('//orderInfo/item') AS x(item)

   29 

   30 /*

   31 OUTPUT:

   32 

   33 ItemCode             category             subcategory         description         qty         rate

   34 -------------------- -------------------- -------------------- -------------------- ----------- ----------------------

   35 A001                 FOOD                 Candies             Nestle Munch         10         11.25

   36 A002                 FOOD                 Biscuits             Britania Good Day    15         12.25

   37 

   38 (2 row(s) affected)

   39 */

Example 4

    1 /*

    2     The following example demonstrates how to extract the value

    3     from a given row. This example extracts a value from the first

    4     row.

    5 

    6     The first example selects the value from the first row.

    7     The second example adds an alias to the result column.

    8     The third example assigns the result to a variable.

    9 */

   10 

   11 DECLARE @x XML

   12 SET @x = '

   13 <orderInfo>

   14     <item code="A001" category="FOOD" subcategory="Candies">

   15         <description>Nestle Munch</description>

   16         <qty>10</qty>

   17         <rate>11.25</rate>

   18     </item>

   19     <item code="A002" category="FOOD" subcategory="Biscuits">

   20         <description>Britania Good Day</description>

   21         <qty>15</qty>

   22         <rate>12.25</rate>

   23     </item>

   24 </orderInfo>'

   25 

   26 SELECT @x.value('(/orderInfo/item/@code)[1]', 'VARCHAR(20)')

   27 

   28 SELECT @x.value('(/orderInfo/item/@code)[1]', 'VARCHAR(20)') AS Code

   29 

   30 DECLARE @code VARCHAR(20)

   31 SELECT @code = @x.value('(/orderInfo/item/@code)[1]', 'VARCHAR(20)')

   32 SELECT @code as Code

   33 

   34 /*

   35 OUTPUT:

   36 

   37 --------------------

   38 A001

   39 

   40 (1 row(s) affected)

   41 

   42 Code

   43 --------------------

   44 A001

   45 

   46 (1 row(s) affected)

   47 

   48 Code

   49 --------------------

   50 A001

   51 

   52 (1 row(s) affected)

   53 */

   54 

Example 5

 

    1 /*

    2     The following example retrieves the value from the second row.

    3 */

    4 

    5 DECLARE @x XML

    6 SET @x = '

    7 <orderInfo>

    8     <item code="A001" category="FOOD" subcategory="Candies">

    9         <description>Nestle Munch</description>

   10         <qty>10</qty>

   11         <rate>11.25</rate>

   12     </item>

   13     <item code="A002" category="FOOD" subcategory="Biscuits">

   14         <description>Britania Good Day</description>

   15         <qty>15</qty>

   16         <rate>12.25</rate>

   17     </item>

   18 </orderInfo>'

   19 

   20 SELECT @x.value('(/orderInfo/item/@code)[2]', 'VARCHAR(20)')

   21 

   22 /*

   23 OUTPUT:

   24 

   25 --------------------

   26 A002

   27 

   28 (1 row(s) affected)

   29 */

   30 

Example 6

 

    1 /*

    2     The following example retrieves the value of an

    3     element from the first row.

    4 */

    5 DECLARE @x XML

    6 SET @x = '

    7 <orderInfo>

    8     <item code="A001" category="FOOD" subcategory="Candies">

    9         <description>Nestle Munch</description>

   10         <qty>10</qty>

   11         <rate>11.25</rate>

   12     </item>

   13     <item code="A002" category="FOOD" subcategory="Biscuits">

   14         <description>Britania Good Day</description>

   15         <qty>15</qty>

   16         <rate>12.25</rate>

   17     </item>

   18 </orderInfo>'

   19 

   20 SELECT @x.value('(/orderInfo/item/description)[1]', 'VARCHAR(20)')

   21 /*

   22 OUTPUT:

   23 

   24 --------------------

   25 Nestle Munch

   26 

   27 (1 row(s) affected)

   28 */

   29 

Example 7

 

    1 /*

    2     The following example retrieves the value of an

    3     element from the second row.

    4 */

    5 DECLARE @x XML

    6 SET @x = '

    7 <orderInfo>

    8     <item code="A001" category="FOOD" subcategory="Candies">

    9         <description>Nestle Munch</description>

   10         <qty>10</qty>

   11         <rate>11.25</rate>

   12     </item>

   13     <item code="A002" category="FOOD" subcategory="Biscuits">

   14         <description>Britania Good Day</description>

   15         <qty>15</qty>

   16         <rate>12.25</rate>

   17     </item>

   18 </orderInfo>'

   19 

   20 SELECT @x.value('(/orderInfo/item/description)[2]', 'VARCHAR(20)')

   21 /*

   22 OUTPUT:

   23 

   24 --------------------

   25 Britania Good Day

   26 

   27 (1 row(s) affected)

   28 */

   29 

Example 8

 

    1 /*

    2     Now let us have a look at filtering results. The following

    3     example applies a filter on an attribute value.

    4 */

    5 DECLARE @x XML

    6 SET @x = '

    7 <orderInfo>

    8     <item code="A001" category="FOOD" subcategory="Candies">

    9         <description>Nestle Munch</description>

   10         <qty>10</qty>

   11         <rate>11.25</rate>

   12     </item>

   13     <item code="A002" category="FOOD" subcategory="Biscuits">

   14         <description>Britania Good Day</description>

   15         <qty>15</qty>

   16         <rate>12.25</rate>

   17     </item>

   18 </orderInfo>'

   19 

   20 SELECT

   21     x.item.value('@code[1]', 'VARCHAR(20)') AS ItemCode,

   22     x.item.value('@subcategory[1]', 'VARCHAR(20)') AS subcategory,

   23     x.item.value('description[1]', 'VARCHAR(20)') AS description,

   24     x.item.value('qty[1]', 'INT') AS qty

   25 FROM @x.nodes('//orderInfo/item') AS x(item)

   26 WHERE x.item.value('@code[1]', 'VARCHAR(20)') = 'A002'

   27 

   28 /*

   29 OUTPUT:

   30 

   31 ItemCode             subcategory         description         qty

   32 -------------------- -------------------- -------------------- -----------

   33 A002                 Biscuits             Britania Good Day    15

   34 

   35 (1 row(s) affected)

   36 */

Example 9

 

    1 /*

    2     The following example applies a filter on the value

    3     of an element.

    4 */

    5 DECLARE @x XML

    6 SET @x = '

    7 <orderInfo>

    8     <item code="A001" category="FOOD" subcategory="Candies">

    9         <description>Nestle Munch</description>

   10         <qty>10</qty>

   11         <rate>11.25</rate>

   12     </item>

   13     <item code="A002" category="FOOD" subcategory="Biscuits">

   14         <description>Britania Good Day</description>

   15         <qty>15</qty>

   16         <rate>12.25</rate>

   17     </item>

   18 </orderInfo>'

   19 

   20 SELECT

   21     x.item.value('@code[1]', 'VARCHAR(20)') AS ItemCode,

   22     x.item.value('@subcategory[1]', 'VARCHAR(20)') AS subcategory,

   23     x.item.value('description[1]', 'VARCHAR(20)') AS description,

   24     x.item.value('qty[1]', 'INT') AS qty

   25 FROM @x.nodes('//orderInfo/item') AS x(item)

   26 WHERE x.item.value('description[1]', 'VARCHAR(20)') = 'Britania Good Day'

   27 

   28 /*

   29 OUTPUT:

   30 

   31 ItemCode             subcategory         description         qty

   32 -------------------- -------------------- -------------------- -----------

   33 A002                 Biscuits             Britania Good Day    15

   34 

   35 (1 row(s) affected)

   36 */

Conclusions

In this article, I have presented a few examples using the Value() method exposed by the XML data type. I will cover the other methods in a later article.

By Jacob Sebastian, 2007/06/06

Total article views: 10203 | Views in the last 30 days: 300
Your response
 
 
Related tags

Miscellaneous    
XML    
 
Already registered?  

Free registration required

To read the rest of this article, and access thousands of other articles, we ask you to register on the site and subscribe to our newsletters.

Register

E-mail address:
Password:
Password (confirm):

  

Subscriptions

We ask you to register on the site and subscribe to our newsletters. Subscribing to our newsletters gets you:

  • ALL of our content (thousands of articles, scripts, and forum postings)
  • A daily newsletter (example)
  • A weekly news round up (example)
  • The opportunity to ask and answer questions in our forums
  • A daily Question of the Day to test and help you increase your knowledge of SQL Server.

We ask that you give the newsletter a try for a week. Over 200,000 SQL Server Professionals a day find it entertaining and useful. If not, you are welcome to unsubscribe at anytime.

Steve Jones
Editor, SQLServerCentral.com