Tải bản đầy đủ (.pdf) (12 trang)

Tài liệu Using the SQL Server FOR XML Clause ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (67.77 KB, 12 trang )


Using the SQL Server FOR XML Clause
With a standard SQL SELECT statement, you submit your SELECT statement to the
database for execution and get results back in the form of rows. SQL Server extends the
SELECT statement to allow you to query the database and get results back as XML. To
do this, you add a FOR XML clause to the end of your SELECT statement. The FOR
XML clause specifies that SQL Server is to return results as XML.
The FOR XML clause has the following syntax:
FOR XML {RAW | AUTO | EXPLICIT}
[, XMLDATA]
[, ELEMENTS]
[, BINARY BASE64]

The RAW, AUTO, and EXPLICIT keywords indicate the XML mode. Table 16.1
shows
a description of the keywords used in the FOR XML clause. In the next sections, you'll
examine some examples of the use of the FOR XML clause.
Table 16.1: FOR XML KEYWORDS
KEYWORD DESCRIPTION
RAW Specifies that each row in your result set is returned as an XML <row>
element. The column values for each row in the result set become
attributes of the <row> element.
AUTO Specifies that each row in the result set is returned as an XML element
The name of the table is used as the name of the tag in the row elements.
EXPLICIT Indicates your SELECT statement specifies a parent-child relationship.
This relationship is then used by SQL Server to generate XML with the
appropriate nested hierarchy.
XMLDATA Specifies that the XML schema is to be included in the returned XML.
ELEMENTS Specifies that the column values are returned as subelements of the row;
otherwise the columns are returned as attributes of the row. You can use
this option only with the AUTO mode.


BINARY
BASE64
Specifies that any binary data returned by your SELECT statement is
encoded in base 64. If you want to retrieve binary data using either the
RAW or EXPLICIT mode, then you must use the BINARY BASE64
option.
Using the RAW Mode
You use the RAW mode to specify that each row in the result set returned by your
SELECT statement is returned as an XML <row> element. The column values for each
row in the result set become attributes of the <row> element.
Listing 16.1
shows an example SELECT statement that retrieves the top three rows from
the Customers table. The results of the SELECT are returned as XML using the FOR
XML RAW clause.
Listing 16.1: FORXMLRAW.SQL

USE Northwind
SELECT TOP 3 CustomerID, CompanyName, ContactName
FROM Customers
ORDER BY CustomerID
FOR XML RAW


Note This SELECT statement is contained in a T-SQL script named ForXmlRaw.sql,
which is located in the sql directory for this chapter.
You can load the ForXmlRaw.sql T-SQL script into Query Analyzer by selecting File ➣
Open from the menu. You then run the script by selecting Query ➣ Execute, or by
pressing the F5 key. Figure 16.1
shows the result of running the script in Query Analyzer.
You'll notice that the XML is shown on one line, and that the line is truncated.


Figure 16.1: Running a SELECT statement containing a FOR XML RAW clause in
Query Analyzer

Note By default, the maximum number of characters displayed by Query Analyzer per
column is 256. Any results longer than 256 characters will be truncated. For the
examples in this section, you'll need to increase the maximum number of characters
to 8,192. To do this, you select Tools ➣ Options in Query Analyzer and set the
Maximum Characters Per Column field to 8,192.
Here's the XML line returned by the example, which I copied from Query Analyzer and
added some return characters to make it easier to read:
<row
CustomerID="ALFKI"
CompanyName="Alfreds Futterkiste"
ContactName="Maria Anders"/>
<row
CustomerID="ANATR"
CompanyName="Ana Trujillo Emparedados y helados"
ContactName="Ana Trujillo"/>
<row
CustomerID="ANTON"
CompanyName="Antonio Moreno Taquería"
ContactName="Antonio Moreno"/>
Notice that each customer is placed within a <row> tag. Also, the column values appear
as attributes within each row; for example, in the first row, the CustomerID attribute is
ALFKI.
Using the AUTO Mode
You use the AUTO mode to specify that each row in the result set is returned as an XML
element. The name of the table is used as the name of the tag in the row elements.
Listing 16.2

shows an example SELECT statement that retrieves the top three rows from
the Customers table. The results are returned as XML using the FOR XML AUTO
clause.
Listing 16.2: FORXMLAUTO.SQL

USE Northwind
SELECT TOP 3 CustomerID, CompanyName, ContactName
FROM Customers
ORDER BY CustomerID
FOR XML AUTO

The XML returned by this example is as follows:
<Customers
CustomerID="ALFKI"
CompanyName="Alfreds Futterkiste"
ContactName="Maria Anders"/>
<Customers
CustomerID="ANATR"
CompanyName="Ana Trujillo Emparedados y helados"
ContactName="Ana Trujillo"/>
<Customers
CustomerID="ANTON"
CompanyName="Antonio Moreno Taquería"
ContactName="Antonio Moreno"/>
Notice that each customer appears within a <Customer> tag instead of a generic <row>
tag, as was the case in the previous RAW mode example.
Using the EXPLICIT Mode
You use the EXPLICIT mode to indicate that your SELECT statement specifies a parent-
child relationship. This relationship is then used by SQL Server to generate XML with
the appropriate nested hierarchy.

When using the EXPLICIT mode, you must provide at least two SELECT statements.
The first SELECT specifies the parent row (or rows), and the second specifies the child
rows. The rows retrieved by the two SELECT statements are related through special
columns named Tag and Parent. Tag specifies the numeric position of the element, and
Parent specifies the Tag number of the parent element (if any).
Let's consider an example that uses two SELECT statements. The first SELECT retrieves
the CustomerID, CompanyName, and ContactName for the row from the Customers table
that has a CustomerID of ALFKI. The second SELECT additionally retrieves the
OrderID and OrderDate from the row in the Orders table that also has a CustomerID of
ALFKI. The first SELECT statement is as follows:
SELECT
1 AS Tag,
0 AS Parent,
CustomerID AS [Customer!1!CustomerID],
CompanyName AS [Customer!1!CompanyName],
ContactName AS [Customer!1!ContactName],
NULL AS [Order!2!OrderID!element],
NULL AS [Order!2!OrderDate!element]
FROM Customers
WHERE CustomerID = 'ALFKI'
The Tag column specifies the numeric position of the row in the XML hierarchy. The
Parent column identifies the parent, which is 0 in the previous SELECT statement; that's
because this row is the parent, or root, in the XML hierarchy.

Note You can also use a Tag value of NULL to indicate the root.
The CustomerID, CompanyName, and ContactName columns in the previous SELECT
are supplied an alias using the AS keyword, followed by a string that uses the following
format:
[elementName!tag!attributeName!directive]
where


elementName specifies the name of the row element in the returned XML.

tag specifies the Tag number.

attributeName specifies the name of the column elements in the returned XML.

directive (optional) specifies how the element is to be treated in the XML. The
directives are shown in Table 16.2
.
Table 16.2: DIRECTIVES
DIRECTIVE DESCRIPTION
element Indicates that the column value appears as a contained row element
within the outer row element, rather than an embedded attribute of
the outer row element. The element directive may be combined
with ID, IDREF, or IDREFS.
hide Indicates that the column value doesn't appear in the returned
XML.
xml Similar to the element directive except that the column value isn't
coded as an entity in the returned XML. This means that the special
characters &, ', >, <, and "are left as is. These characters would
otherwise be coded as &amp;, &apos;, &gt;, &lt;, and &quot;
respectively. The xml directive may be combined with hide.
xmltext Indicates that the column value is contained in a single tag. To use
the xmltext directive, your column type must be varchar, nvarchar,
char, nchar, text, or ntext.
cdata Indicates that the column value is contained within a CDATA
section. CDATA sections are used to escape blocks of text
containing special characters that would otherwise be interpreted as
markup; these characters include &, ', >, <, and ". To use the cdata

directive, your column type must be varchar, nvarchar, text, or

×