Problem
With XML
being used in so many application and data exchange capacities, extracting XML
from SQL Server should not be a challenge. Yet, some organizations are
building complex applications to do so and overlooking some of the native SQL
Server features. If the data tier has a viable option to extract XML in a
native format, should that option be considered?
Solution
Yes -
Should be the resounding answer. The trusted SELECT statement (SQL Server 2000 and SQL Server 2005) includes a FOR XML option (SQL Server 2000 and SQL Server 2005) with the ability to extract XML in a few
different formats. Each of these options offers a different means to
format the XML.
Why would I want to use the FOR XML options?
One of the strongest reasons to use one of the FOR XML options is that they are a simple extension to the trusted SELECT statement. Regardless of the application, some sort of SELECT statement needs to be built, so adding the XML parameters is a no brainier. Another consideration for choosing the FOR XML statement is that the SELECT statement can be called from a stored procedure, DTS\SSIS package or a script. Finally, the FOR XML clause is supported in both SQL Server 2000 (with the exception of the XML PATH option) and 2005.
What are the differences between the FOR XML options?
| ID | Option | Description |
| 1 | FOR XML AUTO | Simple nested tree of XML with each column being represented as a single element |
| 2 | FOR XML RAW | Each row in the result set is transformed into generic <row> element tag |
| 3 | FOR XML EXPLICIT | A predefined XML format is created for the result set |
| 4 | FOR XML PATH | Much
of the same functionality as the EXPLICIT mode, but the elements and
attributes can be built with XPATH like syntax
This option is not available in SQL Server 2000. |
FOR XML AUTO
| SQL Server 2000 | SQL Server 2005 |
| SELECT
TOP 1 a.au_lname AS ‘AuthorLastName‘, a.au_fname AS ‘AuthorFirstName‘, t.title AS ‘Title‘, t.pubdate AS ‘PublicationDate‘ FROM dbo.Authors a INNER JOIN dbo.TitleAuthor ta ON a.au_id = ta.au_id INNER JOIN dbo.Titles t ON ta.title_id = t.title_id WHERE a.state = ‘CA‘ FOR XML AUTO |
SELECT
TOP 1 c.CourseName, c.CourseDesc, s.SectionTitle FROM Course c INNER JOIN Section s ON c.CourseID = s.CourseID FOR XML AUTO |
| <a AuthorLastName="Green" AuthorFirstName="Marjorie"><t Title="The Busy Executive's Database Guide" PublicationDate="1991-06-12T00:00:00"/></a> | <c CourseName="DBMS-101" CourseDesc="Database fundamentals"><s SectionTitle="MWF-8:00 AM"/></c> |
FOR XML RAW
| SQL Server 2000 | SQL Server 2005 |
| SELECT
TOP 1 a.au_lname AS ‘AuthorLastName‘, a.au_fname AS ‘AuthorFirstName‘, t.title AS ‘Title‘, t.pubdate AS ‘PublicationDate‘ FROM dbo.Authors a INNER JOIN dbo.TitleAuthor ta ON a.au_id = ta.au_id INNER JOIN dbo.Titles t ON ta.title_id = t.title_id WHERE a.state = ‘CA‘ FOR XML RAW |
SELECT
TOP 1 c.CourseName, c.CourseDesc, s.SectionTitle FROM Course c INNER JOIN Section s ON c.CourseID = s.CourseID FOR XML RAW |
| <row AuthorLastName="Green" AuthorFirstName="Marjorie" Title="The Busy Executive's Database Guide" PublicationDate="1991-06-12T00:00:00"/> | <row CourseName="DBMS-101" CourseDesc="Database fundamentals" SectionTitle="MWF-8:00 AM"/> |
FOR XML EXPLICIT
| SQL Server 2000 | SQL Server 2005 |
| SELECT
1 AS Tag, NULL AS Parent, t.title AS [Title!1!TitleName], NULL AS [LastName!2!AuthorLastName] FROM dbo.Authors a INNER JOIN dbo.TitleAuthor ta ON a.au_id = ta.au_id INNER JOIN dbo.Titles t ON ta.title_id = t.title_id WHERE a.state = ‘CA‘ UNION ALL SELECT 2 AS Tag, 1 AS Parent, t.title, a.au_lname FROM dbo.Authors a INNER JOIN dbo.TitleAuthor ta ON a.au_id = ta.au_id INNER JOIN dbo.Titles t ON ta.title_id = t.title_id WHERE a.state = ‘CA‘ ORDER BY [Title!1!TitleName], [LastName!2!AuthorLastName] FOR XML EXPLICIT |
SELECT
1 AS Tag, NULL AS Parent, c.CourseName AS [Course!1!CourseName], NULL AS [Section!2!SectionTitle] FROM Course c INNER JOIN Section s ON c.CourseID = s.CourseID WHERE c.CourseID = 1 UNION ALL SELECT 2 AS Tag, 1 AS Parent, c.CourseName, s.SectionTitle FROM Course c INNER JOIN Section s ON c.CourseID = s.CourseID WHERE c.CourseID = 1 FOR XML EXPLICIT |
| <Title TitleName="But Is It User Friendly?"> <LastName AuthorLastName="Carson"/></Title> ... | <Course CourseName="DBMS-101"> <Section SectionTitle="MWF-8:00 AM" /> </Course> |
FOR XML PATH
| SQL Server 2000 | SQL Server 2005 |
| Not available | SELECT
c.CourseName, c.CourseDesc, s.SectionTitle FROM Course c INNER JOIN Section s ON c.CourseID = s.CourseID FOR XML PATH |
| Not available | <row> <CourseName>DBMS-101</CourseName> < CourseDesc>Database fundamentals</CourseDesc> < SectionTitle>MWF-8:00 AM</SectionTitle> </row> |
Next Steps
sql server 中生成xml,布布扣,bubuko.com
原文:http://www.cnblogs.com/ifutan/p/3642876.html