zoukankan      html  css  js  c++  java
  • sql server 中生成xml

    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, DTSSSIS 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&apos;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&apos;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

      • As you are faced with requirements to extract XML from your current systems, consider the SELECT FOR XML options as a viable means to complete the task.
      • If you have not had time to explore the many capabilities of XML, start with these simple examples and begin to make them more complex to meet your needs.
      • Stay tuned for more of SQL Server's native XML capabilities
  • 相关阅读:
    分布式集群系统下的高可用session解决方案
    Google大数据三篇著名论文中文版
    12款免费与开源的NoSQL数据库介绍
    揭密Node.js 盛行的因由(转载)
    lion.ec开源框架简介(原创)
    2.2 Hadoop Studio 使用 [Hadoop学习笔记]
    spring3.2+ehcache 注解使用
    Venus 是一个简单的、高性能、高并发能力的java 开源Remoting框架
    ZooKeeper原理分析
    Netty系列之Netty高性能之道(转载InfoQ)
  • 原文地址:https://www.cnblogs.com/ifutan/p/3642876.html
Copyright © 2011-2022 走看看