rt

解决方案 »

  1.   

    --测试数据
    declare @a table(a char(1),b char(1))insert @a
    select 'a','a' union all
    select 'a','a' union all
    select 'a','a' union all
    select 'b','a' union all
    select 'b','a' union all
    select 'b','b' union all
    select 'c','a' union all
    select 'c','a' union all
    select 'c','c'select * from @a for xml auto
      

  2.   

    没有别的方法的话,就将表的数据读到DataSet里.
    DataSet本身有写XML的方法.
    dim ds as NEW DATASET '你读到的表
    ds.WriteXml(filename, XmlWriteMode.WriteSchema)  'filename:XML路径
      

  3.   


    --测试--测试数据
    create table tx(a int primary key,b varchar(200),c varchar(200))
    insert into tx(a,b,c)values(1,'aaa','bbb')
    insert into tx(a,b,c)values(2,'ccc','ddd')
    insert into tx(a,b,c)values(3,'eee','fff')
    insert into tx(a,b,c)values(4,'ggg','hhh')
    insert into tx(a,b,c)values(5,'iii','jjj')
    go--导出XML文件处理
    create table ##t(re nvarchar(4000))
    insert ##t
    select re='<?xml version="1.0" encoding="gb2312"?>'
    union all select '<table name="tx">'
    union all
    select space(4)+'<record a="'+cast(a as varchar)+'">
    '+space(8)+'<b>'+isnull(b,'')+'</b>
    '+space(8)+'<c>'+isnull(c,'')+'</c>
    '+space(4)+'</record>'
    from tx
    union all select '</table>'--导出XML(文件名:c:\a.xml),注意参数大小写
    exec master..xp_cmdshell 'bcp ##t out "c:\a.xml" /P"" /c' go--删除测试
    drop table tx/*--生成的xml文件内容<?xml version="1.0" encoding="gb2312"?>
    <table name="tx">
        <record a="1">
            <b>aaa</b>
            <c>bbb</c>
        </record>
        <record a="2">
            <b>ccc</b>
            <c>ddd</c>
        </record>
        <record a="3">
            <b>eee</b>
            <c>fff</c>
        </record>
        <record a="4">
            <b>ggg</b>
            <c>hhh</c>
        </record>
        <record a="5">
            <b>iii</b>
            <c>jjj</c>
        </record>
    </table>--*/
      

  4.   

    我正在为公司开发一个工具,把数据库导出到excel里,可以在这基础上直接添加标题/表头/颜色和公式编辑器。为了以后在web上直接能动态打开excel。
      

  5.   

    zjcxc有一个问题,不知版主碰到过没?就是union all select '</table>'虽是最后一条,最插入后有时既然不是最后一条,这样out时XML文件就不对了。困扰!
      

  6.   

    用T-SQL的XML支持也可以。本身就有一个For XML选项的!在BOL里有的~!~!
      

  7.   

    SELECT语句中有个For XML的子句,使用方式如下:
    FOR XML 子句的使用准则
    FOR XML 子句只有在 SELECT 语句中及受到以下限制时才有效: 无论在 UPDATE、INSERT 或 DELETE 语句、嵌套 SELECT 语句还是其它语句(SELECT INTO、赋值语句)中,FOR XML 在子选择中都无效。例如,不支持下面示例中的子选择: 
    示例 ASELECT *
    FROM Table1
    WHERE ......(SELECT * FROM Table2 FOR XML RAW)示例 BDECLARE @doc nchar(3000)
    SET @doc = (SELECT * FROM Customers WHERE CustomerID = 'ALFKI' FOR XML RAW)对于与 COMPUTE BY 或 FOR BROWSE 子句一起使用的任何选择语句,FOR XML 都无效,例如: 
    SELECT OrderID, UnitPrice 
    FROM [Order Details] 
    ORDER BY OrderID COMPUTE SUM(UnitPrice) BY OrderID当前不支持 GROUP BY 和聚合函数与 FOR XML AUTO 共同使用。例如: 
    SELECT max(price), min(price), avg(price)
    FROM titles
    FOR XML AUTOFOR XML 在用于视图定义或用于返回行集的用户定义函数的 SELECT 语句中无效。例如,不能使用下面的语句: 
    CREATE VIEW AllOrders AS SELECT * FROM Orders FOR XML AUTO但是允许如下的语句:SELECT * FROM ViewName FOR XML AUTO are allowed.FOR XML 无法用于需要在存储过程中进一步处理的选择语句。 
    FOR XML 不能与游标一起使用。
    一般情况下,FOR XML 无法不能不直接将结果输出到 Microsoft&reg; SQL Server&#8482; 2000 客户端的任何选择语句。
    FOR XML 无法用于在 INSERT 语句中调用的存储过程。
    如果带 FOR XML 子句的 SELECT 语句在查询中指定一个由四部分组成的名称,则在本地计算机上执行查询时,在所得到的 XML 文档中将不返回这个服务器名称。但是,当在网络服务器上执行查询时,将返回这个由四部分组成的服务器名称。 
    例如,对于下面的查询:SELECT TOP 1 LastName
    FROM ServerName.Northwind.dbo.Employees
    FOR XML AUTO当 ServerName 是本地服务器时,该查询返回:<Northwind.dbo.Employees LastName="Buchanan"/>当 ServerName 是网络服务器时,该查询返回:<ServerName.Northwind.dbo.Employees LastName="Buchanan"/>通过指定下列别名可避免上述现象:SELECT TOP 1 LastName
    FROM ServerName.Northwind.dbo.Employees x
    FOR XML AUTO 该查询返回:<x ="Buchanan"/>在带 FOR XML AUTO 子句的 SELECT 语句中使用派生表可能不会产生希望的嵌套。 
    当指定使用 FOR XML AUTO 模式的查询时,将实现 FOR BROWSE 模式。FOR XML AUTO 模式使用 FOR BROWSE 模式提供的信息确定结果集中的层次结构。 例如,请看下面的查询。在该查询中创建了派生表 P。SELECT c.CompanyName,
           o.OrderID,
           o.OrderDate,
           p.ProductName,
           p.Quantity,
           p.UnitPrice,
           p.Total
    FROM   Customers AS c
           JOIN
           Orders AS o
           ON
           c.CustomerID = o.CustomerID
           JOIN
           (
             SELECT od.OrderID,
                    pr.ProductName,
                    od.Quantity,
                    od.UnitPrice,
                    od.Quantity * od.UnitPrice AS total
             FROM   Products AS pr
                    JOIN
                    [Order Details] AS od
                    ON
                    pr.ProductID = od.ProductID
           ) AS p
           ON
           o.OrderID = p.OrderID
    FOR XML AUTO下面是部分结果:<c CompanyName="Vins et alcools Chevalier">
      <o OrderID="10248" OrderDate="1996-07-04T00:00:00">
        <pr ProductName="Queso Cabrales">
            <od Quantity="12" UnitPrice="14.0000" total="168.0000"/>
        </pr>
        <pr ProductName="Singaporean Hokkien Fried Mee">
            <od Quantity="10" UnitPrice="9.8000" total="98.0000"/>
        </pr>
    </c>在所得到的 XML 文档中缺少 <p> 元素,且返回 <pr> 和 <od> 元素。发生这种现象的原因是查询优化器在结果中消除 P 表,并返回包含 od 表和 pr 表的结果集。 通过重新编写该查询可避免上述现象。例如,可重新编写该查询以创建一个视图并在 SELECT 语句中使用该视图:CREATE VIEW p AS  
             SELECT od.OrderID,
                    pr.ProductName,
                    od.Quantity,
                    od.UnitPrice,
                    od.Quantity * od.UnitPrice AS total
             FROM   Products AS pr
                    JOIN
                    [Order Details] AS od
                    ON
                    pr.ProductID = od.ProductID然后编写 SELECT 语句:SELECT c.CompanyName,
           o.OrderID,
           o.OrderDate,
           p.ProductName,
           p.Quantity,
           p.UnitPrice,
           p.total
    FROM   Customers AS c
           JOIN
           Orders AS o
           ON
           c.CustomerID = o.CustomerID
           JOIN
            p
           ON
           o.OrderID = p.OrderID
    FOR XML AUTO下面是部分结果:<c CompanyName="Vins et alcools Chevalier">
      <o OrderID="10248" OrderDate="1996-07-04T00:00:00">
        <p ProductName="Queso Cabrales" 
           Quantity="12" 
           UnitPrice="14.0000" 
           total="168.0000"/>
      </o>
    </c>另外,将包含在 XML 名称中无效的字符(如空格)的 SQL Server 名称转换为 XML 名称的方法是将无效字符转换为转义数字实体编码。仅有两个非字母字符可以在 XML 名称的开始位置使用:冒号 (:) 和下划线 (_)。因为冒号 (:) 已经保留给命名空间,所以将下划线 (_) 选作转义符。编码的转义规则是: 不是有效 XML 名称字符(根据 XML 1.0 规范)的任何 UCS-2 字符均转义为 _xHHHH_ 的形式,其中 HHHH 代表字符的四位十六进制 UCS-2 代码,以最高有效位排在最前面的顺序。例如,表名 Order Details 编码为 Order_x0020_Details。
    不符合 UCS-2 领域的字符(介于 U+00010000 和 U+0010FFFF 范围之间的附加 UCS-4 字符)均编码为 _xHHHHHHHH_,其中 HHHHHHHH 代表字符的八位十六进制 UCS-4 编码。
    下划线字符不需要进行转义,除非其后为字符 x。例如,表名 Order_Details 不进行编码。
    标识符中的冒号 (:) 字符不进行编码,以便 FOR XML 查询可以生成命名空间元素和特性名。例如,下列查询在名称中生成包含冒号的命名空间特性: 
    SELECT 'namespace-urn' as 'xmlns:namespace', 
             1 as 'namespace:a' 
    FOR XML RAW该查询产生下列结果:<row xmlns:namespace="namespace-urn" namespace:a="1"/>在 SELECT 查询中,将任何列投影到二进制大对象 (BLOB) 会使该列成为临时实体(丢失相关联的表名和列名)。这使 AUTO 模式查询产生错误,因为它不知道将该值放在 XML 层次结构的何处,例如: 
    CREATE TABLE MyTable (Col1 int PRIMARY KEY, Col2 binary)
    INSERT INTO MyTable VALUES (1, 0x7)因为投影到 BLOB,该查询产生一个错误信息:SELECT Col1,
             CAST(Col2 as image) as Col2
    FROM MyTable
    FOR XML AUTO如果删除投影,该查询将产生预期的结果:SELECT Col1,
             Col2
    FROM MyTable
    FOR XML AUTO结果如下:<Computed Col1="1" Col2="dbobject/Computed[@Col1='1']/@Col2"/> 
      

  8.   

    使用 FOR XML 检索 XML 文档
    可以对现有的关系数据库执行 SQL 查询,以返回 XML 文档形式而不是标准行集的结果。若要直接检索结果,请使用 SELECT 语句的 FOR XML 子句,并且在 FOR XML 子句中指定下列 XML 模式之一:
    RAW
    AUTO
    EXPLICIT 
    这些模式仅在设置它们的查询执行时有效。它们对后面执行的任何查询的结果没有影响。除了指定 XML 模式外,还可以请求 XML-Data 架构。